我有一个泛型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] 删除。
我来说两句