【问题标题】:C# Resolving a Type as generic type [duplicate]C#将类型解析为泛型类型[重复]
【发布时间】:2017-05-18 07:08:02
【问题描述】:

我正在使用反射来动态创建对象

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>;

得到一个编译错误:

'fooType' 是一个变量,但用作类型。

如何使用 fooType 变量设置 AnimalViewModel 的类型? fooType -> Foo

【问题讨论】:

  • 您希望 obj 与您的反射版本一起做什么。显示您计划使用的代码示例。
  • 可能无法做到您想要的。另一方面,您可以通过让您的视图模型实现 IAnimalViewModel 并通过该类型引用它来完成同样的事情。
  • 您不能以这种方式使用fooType。您在 &lt; &gt; 中放置的内容应该是类型名称,而不是变量——不管它是否是反射。
  • 您似乎正试图灵活地动态创建实例并具有严格的类型安全性。我知道实现这一点的唯一方法是定义相关类型实现的接口(或更多)。您可以像现在一样动态地创建实例,但是在进行强制转换时,您将强制转换到接口。然后在代码中你只需要引用接口。
  • 另请参阅:stackoverflow.com/questions/223952/…stackoverflow.com/questions/19555896/…stackoverflow.com/questions/326285/…。请注意,创建实例是一回事。使用它完全是另一回事。您的问题没有解释,即使您创建了这种动态指定的类型,您认为您将如何使用它。

标签: c# generics reflection


【解决方案1】:

正确,&lt;&gt; 中的类型信息是编译时类型引用。 IE。类型本身,而不是包含描述类型的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);

而且您不能真正将其转换为编译时已知类型,除非您可以保证加载的类型派生自编译时已知类型。动态类型正是如此 - 您在运行时动态处理它。

【讨论】:

    猜你喜欢
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多