我试图通过检查键和值的类型并使用反射创建适当类型的新字典,将字典< dynamic,dynamic >转换为静态类型的字典。如果我知道键和值类型,我可以执行以下操作:
Type dictType = typeof(Dictionary<,>);
newDict = Activator.CreateInstance(dictType.MakeGenericType(new Type[] { keyType, valueType }));但是,我可能需要创建一个字典< MyKeyType, dynamic >,如果这些值不是全部相同的类型,并且我无法确定如何指定动态类型,因为
typeof(dynamic)不可行。
我该如何做到这一点,或者有更简单的方法来完成我想要做的事情呢?
发布于 2011-02-27 10:45:48
C#编译器将System.Object作为“动态”的类型。"dynamic“是一个特定于语言的结构,在公共语言基础结构中没有相应的类型。因此,您不能使用反射来创建“动态”,也不能使用“动态”作为泛型类型参数。
Dictionary实际上是Dictionary。对于编译器来说,“动态”意味着什么就是延迟--使用反射绑定对象的任何成员访问(如果您好奇,实现在Microsoft.CSharp程序集中)。
另外,编译器还将在“动态”字段、参数等上发出属性DynamicAttribute;这允许使用程序集元数据的人区分System.Object和“动态”。例如,这就是IntelliSense从程序集引用中将方法的参数显示为动态的方式。
发布于 2011-02-27 10:33:32
Dictionary<MyType, Object>
Activator.CreateInstance(typeof (Dictionary<dynamic, dynamic>));这实际上创建了一个Dictionary<Object, Object>
我唯一能看到的使用动态而不是对象的方法是在代码输入过程中,你可以使用dic的“一些”.MyDynProperty.但是,如果您使用Activator创建对象,它将返回对象,因此在代码类型中没有任何用处.
https://stackoverflow.com/questions/5132639
复制相似问题