4

可以说我有 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# 中的等效魔法是什么?

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参数,或作为泛型类型参数。在前一种情况下,如果泛型类Foo<T>继承自在FooBase类型 T 中不是泛型的基类(例如 ),则可以使用Dictionary<Type,FooBase>. 该类可以包括其签名不依赖于的FooBase所有成员(可能是abstractvirtual),因此给定任意类型的对象但没有泛型类型参数的代码将能够处理任何可以在没有泛型类型参数的情况下完成。请注意,如果有一个Foo<T>TTypeFooBaseType对象并希望像使用泛型类型一样使用它,通常必须使用反射并构造委托或泛型类实例并填充类型参数;一旦这样做了,就可以使用下面的第二种方法。

如果一个人有一个可用的泛型类型参数(例如,一个人正在编写一个方法,一个人可以定义一个带有静态字段T GetThing<T>(whatever)的静态泛型类。在这种情况下,对于任何类型,将是一个类型的字段。一个人将能够做到这个字段可以用.ThingHolder<T>T theThingTTThingHolder<TT>.theThingTTTT

于 2013-08-19T20:50:06.563 回答