【问题标题】:Creating dynamic generics at runtime using Reflection使用反射在运行时创建动态泛型
【发布时间】:2011-07-05 04:41:07
【问题描述】:

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

Type dictType = typeof(Dictionary<,>);

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

但是,如果值不是全部相同的类型,我不知道如何指定动态类型,因为

typeof(dynamic)

不可行。

我将如何去做,和/或有没有更简单的方法来完成我想做的事情?

【问题讨论】:

  • 除此之外,用例是什么?通过反射创建字典并用数据填充它们应该比使用动态的性能开销要慢吗?

标签: c# generics reflection dynamic


【解决方案1】:

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

字典 实际上是字典。 “动态”对编译器意味着什么只是后期绑定使用反射的对象的任何成员访问(如果您好奇,其实现位于 Microsoft.CSharp 程序集中)。

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

【讨论】:

  • 作为在 VS 2010 中编写的元数据签名 blob 解析器的人,让我告诉你正确处理 DynamicAttribute 是一个真正的痛苦:)
【解决方案2】:
Dictionary<MyType, Object>

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

这实际上创建了一个Dictionary&lt;Object, Object&gt;

我可以从使用动态而不是对象中看到的唯一用途是在代码键入期间您可以使用 dic["some"].MyDynProperty.... 但是如果您使用 Activator 创建对象,它将返回 Object 所以在代码输入...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    相关资源
    最近更新 更多