首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从C#类型变量初始化泛型变量

从C#类型变量初始化泛型变量
EN

Stack Overflow用户
提问于 2013-07-08 12:08:34
回答 2查看 81.1K关注 0票数 62

我有一个将泛型类型作为其初始化的一部分的类。

代码语言:javascript
复制
public class AnimalContext<T>
{
    public DoAnimalStuff()
    {
        //AnimalType Specific Code
    }
}

我现在能做的是

代码语言:javascript
复制
AnimalContext<Donkey> donkeyContext = new AnimalContext<Donkey>();
AnimalContext<Orca> orcaContext = new AnimalContext<Orca>();

但是我需要/想要做的是能够声明一个初始化为只在运行时才知道的类型的AnimalContext。例如,

代码语言:javascript
复制
Animal a = MyFavoriteAnimal(); //returns an instance of a class 
                               //implementing an animal
AnimalContext<a.GetType()> a_Context = new AnimalContext<a.GetType()>();
a_Context.DoAnimalStuff();

这有可能吗?我似乎在网上找不到这个问题的答案。

EN

回答 2

Stack Overflow用户

发布于 2013-07-08 12:12:37

您可以通过使用MakeGenericType方法并利用dynamic关键字来使用泛型类型的反射:

代码语言:javascript
复制
var type = typeof (AnimalContext<>).MakeGenericType(a.GetType());
dynamic a_Context = Activator.CreateInstance(type);

因此,您可以调用:

代码语言:javascript
复制
a_Context.DoAnimalStuff();

或者再次使用反射来调用方法:

代码语言:javascript
复制
type.GetMethod("DoAnimalStuff").Invoke(a_Context, null);
票数 10
EN

Stack Overflow用户

发布于 2013-07-08 12:13:57

您需要使用反射创建类型,然后调用该类型。类似于:

代码语言:javascript
复制
Animal a = MyFavoriteAnimal();
var contextType = typeof(EsbRepository<>).MakeGenericType(a.GetType());

dynamic context = Activator.CreateInstance(contextType);
context.DoAnimalStuff();

使用动态意味着上下文变量将在运行时计算,从而允许您调用DoAnimalStuff方法。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17519078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档