使用反射在运行时实例化List <T>的派生类

用户名

我有一个泛型class MyList<T> : MyBaseClass, IList<T>,可以接受未知数量的未知元素类型。
我在其他地方声明了一些自定义列表,没有实例化它们(由于某些常规限制,这是必须的):

MyList<MyObjectType1> type1List1, type1List2,... ;
MyList<MyObjectType2> type2List1, type2List2,... ;

我想在运行时使用反射实例化那些自定义列表:

foreach (FieldInfo field in this.GetType().GetFields())
{
   if (field.FieldType == typeof(MyList<>)) // this condition is **NEVER** passed!
   {
      MyList<>valueToSet = new MyList<>(); // does not work, needs type
      MyList<T>valueToSet = new MyList<T>(); // does not work, there's no T
      MyList<...?...>valueToSet = new MyList<...?...>(); // how can i put here the type?
      field.SetValue(this, valueToSet);
      ...
   }
}

我遇到的问题是,因此直到运行时才知道每个已声明列表中使用的对象的类型,我找不到用于实例化的代码中的表达式MyList<...?...>valueToSet = new MyList<...?...>(),以及令人惊讶的(至少对我而言) )表达式if (field.FieldType == typeof(MyList<>))永远不会过去。

以防万一,请注意,由于某些类依赖性和约束,我无法为创建接口MyList<T>

在此先感谢您的帮助!

编辑:
感谢迈克清道夫,我可以彻底解决这个问题

迈克·兹伯雷

第一部分是进行比较,您真正要寻找的是比较字段类型的泛型类型定义。将您的if语句更改为使用GetGenericTypeDefinition来检查以下内容:

if (field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition() == typeof(MyList<>))

接下来,您必须构造一个未知类型的实例,Activator.CreateInstance通常是执行此操作的最简单方法:

var list = Activator.CreateInstance(field.FieldType);
field.SetValue(this, list);

现在我注意到的一件事是,我们正在当前对象上设置字段。这有点不寻常。这是为什么?您在编译时不知道所有这些类型吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在运行时使用反射实例化的List <T>的派生类上的Set属性

来自分类Dev

T类型的派生类的序列化

来自分类Dev

使用反射在运行时创建类

来自分类Dev

使用反射在运行时创建类

来自分类Dev

在运行时C ++中使用派生类

来自分类Dev

如何将List <T>强制转换为T的派生类

来自分类Dev

如何在运行时从ObservableCollection <T>派生的类的实例创建?

来自分类Dev

对派生类中的成员变量使用派生类型

来自分类Dev

从基类创建派生类的实例

来自分类Dev

静态实例基类/派生类

来自分类Dev

静态实例基类/派生类

来自分类Dev

使用派生类时的必要引用

来自分类Dev

在基本方法中使用派生类

来自分类Dev

何时使用模板而不是派生类

来自分类Dev

使用派生类放置新的

来自分类Dev

是否超过一个密封类结果在运行时反射在表达时使用`is`的?

来自分类Dev

Perl在运行时是否有实际的派生类?

来自分类Dev

派生类实例化BASE类的2个对象

来自分类Dev

基类的工厂方法实例化派生类

来自分类Dev

如何使用派生类序列化基类

来自分类Dev

使用派生类成员初始化父类

来自分类Dev

通过反射将基类转换为派生类

来自分类Dev

返回派生类实例而不是基类实例

来自分类Dev

在基类内部使用派生类实例调用带有派生类数据的基类方法

来自分类Dev

如何从派生类中获取基类实例

来自分类Dev

从基类实例调用派生类方法

来自分类Dev

从基类的实例调用派生类的函数

来自分类Dev

从基类成员函数返回派生类的实例

来自分类Dev

比较具有相同父类的派生类的实例