首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用反射在运行时创建动态泛型

使用反射在运行时创建动态泛型
EN

Stack Overflow用户
提问于 2011-02-27 10:24:52
回答 2查看 1.5K关注 0票数 6

我试图通过检查键和值的类型并使用反射创建适当类型的新字典,将字典< dynamicdynamic >转换为静态类型的字典。如果我知道键和值类型,我可以执行以下操作:

代码语言:javascript
复制
Type dictType = typeof(Dictionary<,>);

        newDict = Activator.CreateInstance(dictType.MakeGenericType(new Type[] { keyType, valueType }));

但是,我可能需要创建一个字典< MyKeyType dynamic >,如果这些值不是全部相同的类型,并且我无法确定如何指定动态类型,因为

代码语言:javascript
复制
typeof(dynamic)

不可行。

我该如何做到这一点,或者有更简单的方法来完成我想要做的事情呢?

EN

回答 2

Stack Overflow用户

发布于 2011-02-27 10:45:48

C#编译器将System.Object作为“动态”的类型。"dynamic“是一个特定于语言的结构,在公共语言基础结构中没有相应的类型。因此,您不能使用反射来创建“动态”,也不能使用“动态”作为泛型类型参数。

Dictionary实际上是Dictionary。对于编译器来说,“动态”意味着什么就是延迟--使用反射绑定对象的任何成员访问(如果您好奇,实现在Microsoft.CSharp程序集中)。

另外,编译器还将在“动态”字段、参数等上发出属性DynamicAttribute;这允许使用程序集元数据的人区分System.Object和“动态”。例如,这就是IntelliSense从程序集引用中将方法的参数显示为动态的方式。

票数 4
EN

Stack Overflow用户

发布于 2011-02-27 10:33:32

代码语言:javascript
复制
Dictionary<MyType, Object>

Activator.CreateInstance(typeof (Dictionary<dynamic, dynamic>));

这实际上创建了一个Dictionary<Object, Object>

我唯一能看到的使用动态而不是对象的方法是在代码输入过程中,你可以使用dic的“一些”.MyDynProperty.但是,如果您使用Activator创建对象,它将返回对象,因此在代码类型中没有任何用处.

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

https://stackoverflow.com/questions/5132639

复制
相关文章

相似问题

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