在C#中,我该如何创建一个泛型字典?

4
假设我有一个泛型类 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> - Seva Alekseyev
嗯,我正在尽可能地保持类型安全。但可能会有一些硬性限制。 - user430788
1
听起来有点像单例生命周期的依赖注入 :P - Charleh
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>;
}

为什么要进行类型转换?不是必须的... - Haney
现在是必要的 :) 但是字典的定义可以是 <Type,Foo<Type>>,所以不需要它 :) - BartoszKP
1
Foo<Type> 与 Foo<T> 不同。Type 是一个具体的类 - 描述 C# 数据类型的类。 - Seva Alekseyev
1
顺便提一下,强制转换是必要的。Dict[xxx] 的类型是 object - Seva Alekseyev
我删除了我的回答并点赞了你的。我的回答是错误的。 - Haney

1
有两种方法可以给一个方法指定类型:作为 Type 参数或作为泛型类型参数。在前一种情况下,如果泛型类 Foo 继承自一个不带有类型 T 的基类(如 FooBase),则可以使用 Dictionary。FooBase 类可以包含所有成员(可能是 abstract 或 virtual)的 Foo,其签名不依赖于 T,因此对于任意类型的 Type 对象但没有泛型类型参数的代码将能够使用 FooBase 完成与没有泛型类型参数时可以完成的任何操作。请注意,如果已经有了 Type 对象并且想要像使用泛型类型一样使用它,则通常必须使用反射并构造一个带有填充了类型参数的委托或泛型类实例;一旦完成了这个过程,就可以使用下面的第二种方法。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接