可以说我有 Generic 类Foo<T>
。
我想要做的是为各种 T 中的每一个创建一个单例,然后稍后通过 T 快速检索它们。
在伪代码中
STORE new Foo<int>
STORE new Foo<MyClass>
GET instance for MyClass -> returns the Foo<MyClass> created above.
在 Java 中,我会创建一个字典,其中包含键和Foo<*>
值的类型。
C# 中的等效魔法是什么?
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>;
}
有两种方法可以给方法一个类型:作为Type
参数,或作为泛型类型参数。在前一种情况下,如果泛型类Foo<T>
继承自在FooBase
类型 T 中不是泛型的基类(例如 ),则可以使用Dictionary<Type,FooBase>
. 该类可以包括其签名不依赖于的FooBase
所有成员(可能是abstract
或virtual
),因此给定任意类型的对象但没有泛型类型参数的代码将能够处理任何可以在没有泛型类型参数的情况下完成。请注意,如果有一个Foo<T>
T
Type
FooBase
Type
对象并希望像使用泛型类型一样使用它,通常必须使用反射并构造委托或泛型类实例并填充类型参数;一旦这样做了,就可以使用下面的第二种方法。
如果一个人有一个可用的泛型类型参数(例如,一个人正在编写一个方法,一个人可以定义一个带有静态字段T GetThing<T>(whatever)
的静态泛型类。在这种情况下,对于任何类型,将是一个类型的字段。一个人将能够做到这个字段可以用.ThingHolder<T>
T theThing
TT
ThingHolder<TT>.theThing
TT
TT