在C#中,我该如何制作泛型词典
本文关键字:何制作 泛型 | 更新日期: 2023-09-27 18:28:09
假设我有泛型类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#中的等效魔术是什么?
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>
继承自在类型T中不是泛型的基类(例如FooBase
),则可以使用Dictionary<Type,FooBase>
。FooBase
类可以包括Foo<T>
的所有成员(可能是abstract
或virtual
),这些成员的签名不依赖于T
,因此,为任意类型提供Type
对象但没有泛型类型参数的代码将能够与FooBase
进行任何在没有泛型类型参数的情况下可以进行的操作。请注意,如果有一个Type
对象并希望将其当作泛型类型来使用,则通常必须使用Reflection并构造一个委托或一个填充了类型参数的泛型类实例;一旦这样做了,就可以使用下面的第二种方法。
如果有可用的泛型类型参数(例如,正在编写方法T GetThing<T>(whatever)
,则可以使用静态字段T theThing
定义静态泛型类ThingHolder<T>
。在这种情况下,对于任何类型的TT
,ThingHolder<TT>.theThing
都将是TT
类型的字段。可以使用此字段执行任何可以使用TT
执行的操作。