我正在尝试转换字典< 动态,动态>通过检查键和值的类型并使用Reflection创建适当类型的新词典来静态类型化。如果我知道键和值类型,我可以执行以下操作:
Type dictType = typeof(Dictionary<,>);
newDict = Activator.CreateInstance(dictType.MakeGenericType(new Type[] { keyType, valueType }));
但是,我可能需要创建一个 Dictionary &lt; MyKeyType ,动态&gt;如果值不是全部相同的类型,我无法弄清楚如何指定动态类型,因为
typeof(dynamic)
不可行。
我将如何做到这一点,和/或是否有更简单的方法来完成我想要做的事情?
答案 0 :(得分:4)
C#编译器将System.Object作为“dynamic”的类型发出。 “dynamic”是特定于语言的构造,并且在公共语言基础结构中没有对应的类型。因此,您将无法使用反射创建“动态”,也无法使用“动态”作为泛型类型参数。
字典&lt;动态,动态&gt;实际上是一个字典&lt; object,object&gt;。 “动态”对编译器意味着什么只是使用反射对对象的任何成员访问进行后期绑定(其实现位于Microsoft.CSharp程序集中,以防您感到好奇)。
另外,编译器还会在“动态”的字段,参数等上发出属性DynamicAttribute;允许人们使用程序集的元数据来区分System.Object和“dynamic”。这就是IntelliSense如何将方法的参数显示为来自装配参考的动态参数,例如。
答案 1 :(得分:2)
Dictionary<MyType, Object>
Activator.CreateInstance(typeof (Dictionary<dynamic, dynamic>));
这实际上会创建一个Dictionary<Object, Object>
我可以通过使用动态而不是对象看到的唯一用途是在代码输入期间你可以使用dic [“some”]。MyDynProperty ....但是如果用Activator创建对象它会返回Object所以没有用代码输入......