我使用反射动态创建对象
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;富
答案 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);
并且您无法将其强制转换为编译时已知类型,除非您可以保证加载的类型派生自编译时已知类型。动态类型就是这样 - 您可以在运行时动态处理它。