我有一个将泛型类型作为其初始化的一部分的类。
public class AnimalContext<T>
{
public DoAnimalStuff()
{
//AnimalType Specific Code
}
}
我现在能做的是
AnimalContext<Donkey> donkeyContext = new AnimalContext<Donkey>();
AnimalContext<Orca> orcaContext = new AnimalContext<Orca>();
但是我需要/想要做的是能够声明一个初始化为只在运行时才知道的类型的AnimalContext。例如,
Animal a = MyFavoriteAnimal(); //returns an instance of a class
//implementing an animal
AnimalContext<a.GetType()> a_Context = new AnimalContext<a.GetType()>();
a_Context.DoAnimalStuff();
这有可能吗?我似乎在网上找不到这个问题的答案。
发布于 2013-07-08 12:12:37
您可以通过使用MakeGenericType
方法并利用dynamic
关键字来使用泛型类型的反射:
var type = typeof (AnimalContext<>).MakeGenericType(a.GetType());
dynamic a_Context = Activator.CreateInstance(type);
因此,您可以调用:
a_Context.DoAnimalStuff();
或者再次使用反射来调用方法:
type.GetMethod("DoAnimalStuff").Invoke(a_Context, null);
发布于 2013-07-08 12:13:57
您需要使用反射创建类型,然后调用该类型。类似于:
Animal a = MyFavoriteAnimal();
var contextType = typeof(EsbRepository<>).MakeGenericType(a.GetType());
dynamic context = Activator.CreateInstance(contextType);
context.DoAnimalStuff();
使用动态意味着上下文变量将在运行时计算,从而允许您调用DoAnimalStuff方法。
https://stackoverflow.com/questions/17519078
复制相似问题