2012-01-25 6 views
0

Genericパラメータを取るメソッドがあります。タイプを2つに制限しました。メソッド内で、私は2つのコンストラクタのうちの1つを呼び出すように設定したい。C#の新しいインスタンスに汎用を設定する

コード:

internal static void CreateAddress<T>(out T address, bool isSave, int? cID) where T: Address_Accessor, Address 
{ 
    DateTime dt= DateTime.Now; 
    int? eID = 1; 
    int? sID = 50; 

    if (typeof(T) == typeof(Address_Accessor)) 
    address = new Address_Accessor(dt, eID , sID); 
    else 
    address = new Address(dt, eID, sID); 
} 

コンパイルの失敗は言う:

が暗黙的に 'T' を型 'Address_Accessor' を変換できません。明示的な変換が存在する(あなたはキャストが欠けている?)アドレスとAddress_Accessorの両方がいくつかの一般的なエンティティ表す場合、簡単な解決策(持っていない任意の詳細は、メソッドの使用例をregardign)として

+3

ジェネリック医薬品は、ここではかなりひどいフィットのように見えます。オーバーロードされたメソッドがうまくいくようです。 –

+0

Address_AccessorとAddressの関係は? –

+0

これは適切ではありませんが、ジェネリックスを使用すると、タイプを動的に混合およびマッチングするだけでなく、特定のタイプを扱うことができます。 –

答えて

1

- ちょうど共通のインターフェースを導入し、Tを制限しますこのインターフェイスを実装するには、IAddressを実装し、IAddressの参照(Tの後ろ)に設定するクラスをinsatntiatingできます。

interface IAddress 
{ 
} 

class Address_Accessor : IAddress 
class Address : IAddress 

internal static void CreateAddress<T>(out T address, bool isSave, int? cID) 
where T: IAddress 
{ 
} 

は、私はあなたが両方AddressAddress_accessor例についてCreateAddress()メソッドを呼び出すコードを投稿してください可能性があり、周りのいくつかの設計上の問題がある感じ?おそらくあなたはある種の抽象的な工場を探していますか?

+2

さらに一般的なものを完全に忘れて、Tの代わりにIAddressを使用してください。 –

+0

これは、 'IAddress'がこのために使用されている場合に、それだけでは、これは悪い習慣です。 –

1

あなたがそのコードを必要とする理由私は理解していないが、それを返すまではTに結果オブジェクトに変換することができます:

object result = typeof(T) == typeof(Address_Accessor) 
    ? (object) new Address_Accessor(dt, eID , sID) 
    : (object) new Address(dt, eID, sID); 

address = (T)result; 
+0

割り当ては機能しましたが、2番めのエラーが発生しました。 address =(T)new Address(dt、eID、sID); 私はちょうど使用できると思う: アドレス=(T)新しいAddress_Accessor(dt、eID、sID); if文なし。 – Josh

+0

もう1つのバージョンがありますが、このバグを解決するためにタイプ階層の変更について考えるべきです。私のコードは一生懸命です。 –

+0

異なるエラー: 'Address_Accessor'と 'Address'の間に暗黙の変換がないため、条件式の型を判別できません - このコードでは別の方法を試してみます。ありがとう。 – Josh

関連する問題