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

6

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

Type dictType = typeof(Dictionary<,>);

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

然而,如果这些值不全是同一类型,我可能需要创建一个Dictionary<MyKeyType, dynamic>。但是我不知道如何指定动态类型。

typeof(dynamic)

这并不可行。

我该如何做到这一点?或者有没有更简单的方法来实现我想做的事情?


那么,使用案例是什么?通过反射创建字典并填充数据应该比使用动态的性能开销更慢吗? - Roger Johansson
2个回答

4
C#编译器将“dynamic”作为System.Object类型发出。 “dynamic”是一种语言特定的构造,Common Language Infrastructure中没有相应的类型。 因此,您将无法使用反射创建“dynamic”,也无法将“dynamic”用作通用类型参数。
Dictionary 实际上是Dictionary 。 对于编译器而言,“dynamic”的含义仅是使用反射来延迟绑定对象的任何成员访问(其实现位于Microsoft.CSharp程序集中,如果您感兴趣)。
顺便说一句,编译器还会在字段、参数等上发出DynamicAttribute属性,这些都是“dynamic”;这使得消费程序集元数据的人们能够区分System.Object和“dynamic”。 这就是IntelliSense如何从程序集引用中显示方法参数为dynamic的示例。

2
作为一个在 VS 2010 中发布的元数据签名 blob 解析器的作者,让我告诉你,正确处理 DynamicAttribute 真的很麻烦 :) - Peter Huene

2
Dictionary<MyType, Object>

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

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

我能看到使用dynamic而不是object的唯一用处是在代码输入时,你可以使用dic["some"].MyDynProperty....,但如果你使用Activator创建对象,它将返回Object,因此在代码输入中没有用处...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接