@H_404_1@HI,
我需要使用反射在运行时为列表对象创建实例.例如我有两个类,如下所示,
我需要使用反射在运行时为列表对象创建实例.例如我有两个类,如下所示,
class Class1 { List<Class2> class2List; public List<Class2> Class2List { get;set; } } class Class2 { public string mem1; public string mem2; }
在另一个Class3类中,在运行时创建Class1的实例后,我想为该类的所有属性分配值.在这种情况下,Class2List是List&Class2>的属性.在运行时,我不知道List&Class2>的类类型.如何初始化属性,即List< Class2>在class3中运行时.
任何建议非常感谢…
解决方法
而不是质疑你的动机,或者试图取消你正在做的 – 我只是在标题中回答这个问题.
给定一个类型实例listElemType,它表示要传递给List>的类型参数.在运行时输入:
var listInstance = (IList)typeof(List<>) .MakeGenericType(listElemType) .GetConstructor(Type.EmptyTypes) .Invoke(null);
然后你可以通过它的IList接口实现来处理列表.
或者,确实,您可以在MakeGenericType调用中停止,并使用它在Activator.CreateInstance的调用中生成的类型,如Daniel Hilgarth的答案.
然后,给定要设置其属性的目标对象:
object target; //the object whose property you want to set target.GetType() .GetProperty("name_of_property") //- Assuming property is public .SetValue(target,listInstance,null); //- Assuming .CanWrite == true // on PropertyInfo
如果您不知道由target表示的类型的属性,则需要使用
target.GetType().GetProperties();
获取该实例的所有公共属性.但是,只有能够创建列表实例才能真正帮助您 – 您必须拥有一个更通用的解决方案,可以应付任何类型.除非你将专门针对列表类型.
听起来像你可能需要一个通用的界面或基础…