在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#中的等效魔术是什么?

在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>的所有成员(可能是abstractvirtual),这些成员的签名不依赖于T,因此,为任意类型提供Type对象但没有泛型类型参数的代码将能够与FooBase进行任何在没有泛型类型参数的情况下可以进行的操作。请注意,如果有一个Type对象并希望将其当作泛型类型来使用,则通常必须使用Reflection并构造一个委托或一个填充了类型参数的泛型类实例;一旦这样做了,就可以使用下面的第二种方法。

如果有可用的泛型类型参数(例如,正在编写方法T GetThing<T>(whatever),则可以使用静态字段T theThing定义静态泛型类ThingHolder<T>。在这种情况下,对于任何类型的TTThingHolder<TT>.theThing都将是TT类型的字段。可以使用此字段执行任何可以使用TT执行的操作。