web-dev-qa-db-ja.com

コンストラクターのジェネリック型

ジェネリック型インターフェイスがあり、オブジェクトのコンストラクターがジェネリックインターフェイスを使用するようにしたい。
お気に入り:

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

このオブジェクトを作成するコードでIGenericTypeを指定します(Inversion of Controlを使用)。私はこれが起こる方法を見ていません。これを達成するための提案はありますか?

誰かに次のようなオブジェクトを作成してもらいたい:

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

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

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

必要に応じて、コンストラクターの後に必要なことを行います。場合によっては、ジェネリックインターフェイスが拡張する非ジェネリックインターフェイスを導入することもできます。

編集:コメントに従って...

引数を新しく作成されたオブジェクトに保存し、厳密に型指定された方法で保存する場合は、型もジェネリックである必要があります。

その時点で、コンストラクターの問題はなくなりますが、may非ジェネリック型でとにかく静的ジェネリックメソッドを保持したいので、型推論を利用できます。

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);
48
Jon Skeet