2009-03-31 16 views
31

私は汎用型インタフェースを持ち、オブジェクトのコンストラクタを汎用インタフェースで使用する必要があります。
ように:コンストラクタの汎用型

public Constructor(int blah, IGenericType<T> instance) 
{} 

私はIGenericType(コントロールの使用反転)を指定するには、このオブジェクトを作成するコードをしたいです。私はこれが起こる方法を見ていない。これを達成するための提案はありますか?

私は誰かがようなオブジェクトを作成します:何でもあなたを

public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance) 

してから実行します。あなたはコンストラクタをジェネリックにすることはできませんが、代わりに汎用的な静的メソッドを使用することができます

Constructor varname = new Constructor(1, new GenericType<int>()); 

答えて

40

を必要に応じてコンストラクタの後ろに移動する必要があります。場合によっては、汎用インタフェースが拡張する非汎用インタフェースを導入することもできます。

EDIT:あなたは新しく作成されたオブジェクトに引数を保存したい、とあなたは強く型付けされた方法で、そうしたい場合は、コメントあたり...

として、その種類も同様ジェネリックでなければなりません。コンストラクタの問題が消えるその時点で

が、あなたはは非ジェネリック型では、とにかく静的ジェネリックメソッドを保存しておきたいことがあります。

public static class Foo 
{ 
    public static Foo<T> CreateInstance<T>(IGenericType<T> instance) 
    { 
     return new Foo<T>(instance); 
    } 
} 

public class Foo<T> 
{ 
    public Foo(IGenericType<T> instance) 
    { 
     // Whatever 
    } 
} 

... 

IGenericType<string> x = new GenericType<string>(); 
Foo<string> noInference = new Foo<string>(x); 
Foo<string> withInference = Foo.CreateInstance(x); 
+0

私は希望:あなたは型推論を利用することができますIGenericTypeをメンバvarとして保存したいのですが、そうするには、メソッド全体だけでなく、クラス全体を汎用化する必要があると思います...? – CSharpAtl

+0

はい、それをメンバ変数として強く型付けする必要がある場合は、型全体をジェネリックにして、コンストラクタの問題がなくなるようにする必要があります。 –

+0

は、基本的に何か良いことがあるかどうかを確認するために私の設計思想を実行したいと考えています。私はこのコメントのすべてを入力することはできないと思う。あなたのブログに投稿したり、あなたにメールすることはできますか? – CSharpAtl

関連する問題