C#将Type解析为泛型类型

时间:2017-05-17 21:13:44

标签: c# generics reflection

我使用反射动态创建对象

var type = Type.GetType("Demo.Namespace.AnimalViewModel, Demo.Assembly", true);
var fooType = Type.GetType("Demo.Namespace.Foo, Demo.Assembly", true);
Activator.CreateInstance(type) as AnimalViewModel<fooType>;

获取编译错误:

  

&#39; fooType&#39;是一个变量但是像Type一样使用。

如何使用fooType变量设置AnimalViewModel的类型? fooType - &gt;富

1 个答案:

答案 0 :(得分:1)

正确,<>内的类型信息是编译时类型引用。即类型本身,而不是包含描述类型的Type实例的变量。原因是因为这里的类型是解析和编译时,而不是运行时。

查看答案https://stackoverflow.com/a/2173115/1556108,特别是部分:

Type unboundGenericList = typeof(List<>);
Type listOfInt = unboundGenericList.MakeGenericType(typeof(int));
if (listOfInt == typeof(List<int>))
    Console.WriteLine("Constructed a List<int> type.");

因为您在运行时构建类型,所以需要使用相同的方法。有点像:

var type = Type.GetType("Demo.Namespace.AnimalViewModel, Demo.Assembly", true);
var fooType = Type.GetType("Demo.Namespace.Foo, Demo.Assembly", true);
var closedType = fooType.MakeGenericType(fooType)
var closedInstance = Activator.CreateInstance(closedType);

并且您无法将其强制转换为编译时已知类型,除非您可以保证加载的类型派生自编译时已知类型。动态类型就是这样 - 您可以在运行时动态处理它。