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

C# 使用反射在运行时创建动态泛型,c#,generics,reflection,dynamic,C#,Generics,Reflection,Dynamic,我试图通过检查键和值的类型并使用反射创建适当类型的新字典,将字典动态,动态>转换为静态类型。如果我知道键和值类型,我可以执行以下操作: Type dictType = typeof(Dictionary<,>); newDict = Activator.CreateInstance(dictType.MakeGenericType(new Type[] { keyType, valueType })); 这是不可行的 我该怎么做,或者有没有更简单的方法来完成我想做

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

Type dictType = typeof(Dictionary<,>);

        newDict = Activator.CreateInstance(dictType.MakeGenericType(new Type[] { keyType, valueType }));
这是不可行的

我该怎么做,或者有没有更简单的方法来完成我想做的事情?

字典
Dictionary<MyType, Object>

Activator.CreateInstance(typeof (Dictionary<dynamic, dynamic>));
CreateInstance(typeof(Dictionary));
这实际上创建了一个
字典

我从使用dynamic而不是object中看到的唯一用途是在键入代码时可以使用dic[“some”]。MyDynProperty。。。。但是,如果使用Activator创建对象,它将返回object,因此在代码类型中没有任何用处…

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

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


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

除此之外,用例是什么?通过反射创建字典并用数据填充字典应该比使用dynamic的性能开销要慢?作为一个编写了VS 2010中发布的元数据签名blob解析器的人,让我告诉您,正确处理DynamicAttribute是一件非常痛苦的事情:)
Dictionary<MyType, Object>

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