4

Generic class があるとしましょうFoo<T>

私がやりたいことは、さまざまな T ごとにシングルトンを作成し、後で T によってそれらをすばやく取得することです。

疑似コードで

STORE new Foo<int>
STORE new Foo<MyClass>

GET instance for MyClass  ->  returns the Foo<MyClass> created above.

Java では、キーと値に Type を持つ辞書を作成しFoo<*>ます。

C#で同等の魔法は何ですか?

4

2 に答える 2

9
Dictionary<Type, object> Dict = new Dictionary<Type, object>();

void Store<T>(Foo<T> foo)
{
    Dict.Add(typeof(T), foo);
}

Foo<T> Retrieve<T>()
{
    return Dict[typeof(T)] as Foo<T>;
}
于 2013-08-19T15:45:05.260 に答える
1

Typeメソッドに型を指定するには、パラメーターとして、またはジェネリック型パラメーターとして2 つの方法があります。前者の場合、ジェネリック クラスが、型 T でジェネリックではないFoo<T>基本クラス (たとえば ) から継承する場合、 を使用できます。クラスには、署名が に依存しないすべてのメンバー (おそらくまたはとして) を含めることができるため、任意の型のオブジェクトが与えられているがジェネリック型パラメーターを持たないコードは、できることは何でも行うことができます。ジェネリック型パラメーターなしで実行できます。ある場合は注意してくださいFooBaseDictionary<Type,FooBase>FooBaseabstractvirtualFoo<T>TTypeFooBaseTypeオブジェクトであり、ジェネリック型であるかのように使用したい場合は、通常、リフレクションを使用して、型パラメーターが入力されたデリゲートまたはジェネリック クラス クラス インスタンスのいずれかを構築する必要があります。それが完了したら、以下の2番目のアプローチを使用できます。

利用可能なジェネリック型パラメーターがある場合 (たとえば、メソッドを記述している場合、静的フィールドをT GetThing<T>(whatever)使用して静的ジェネリック クラスを定義できます。その場合、任意の型について、型のフィールドになります。このフィールドは、.ThingHolder<T>T theThingTTThingHolder<TT>.theThingTTTT

于 2013-08-19T20:50:06.563 に答える