问题遇到的现象和发生背景
利用C# 反射创建对象,对象中有泛型列表
问题相关代码,请勿粘贴截图
//随便写了一个类似的类对象,假如需要反射创建这个类
public class Adult
{
public List<Girl> Girls { get; set; }
public List<Boy> Boys { get; set; }
public Adult(XmlNode xmlNode)
{
CreateObject.CreatObjectFormXmlNodeAtt(this, xmlNode);
}
}
//------------------------利用反射创建泛型对象列表------------------------------
if (pi.PropertyType.IsGenericType) //如果子节点是泛型对象。
{
Type type = pi.PropertyType.GetGenericArguments()[0];
//Assembly ass = Assembly.GetAssembly(type);//获取泛型的程序集
//Object _obj = ass.CreateInstance(type.FullName);//泛型实例化
// 我知道需要在这里创建泛型列表,但由于类型是不确定的,所以只能用object,但到了后面又无法转化
List<object> list = new List<object>(); //因为这里泛型中的类型是不确定的,但已经有了type 但无法根据type 创建List<type>列表啊
//PropertyInfo[] pc = type.GetProperties();//获取到泛型所有属性的集合
for (int i = 0; i < xmlNode.ChildNodes.Count; i++) //循环所有子节点,找到当前创建对象的节点
{
if (xmlNode.ChildNodes[i].Name == type.Name) //根据节点名称找到对象的节点
{
object[] parameters = new object[1];
parameters[0] = xmlNode.ChildNodes[i]; //参数赋值
object subObj = Activator.CreateInstance(type, parameters);
list.Add(subObj);
//pi.SetValue(obj, subObj);
}
}
if (list.Count>0)
{
pi.SetValue(obj, list); //但到这里提示不能将 List<object> 强制转化为List<Man>. 这里有可能是Man,也可能是其他的class
//
}
}
我的解答思路和尝试过的方法
也尝试过创建List对象,但这个对象是object,没法插入数据
/// <summary>
/// 创建List
/// </summary>
/// <param name="type">类型</param>
/// <returns></returns>
public static object CreateList(Type type)
{
Type listType = type.GetType();
Type newType = listType.MakeGenericType(new Type[] {type});
return Activator.CreateInstance(newType, new object[] { });
}
我想要达到的结果
由于是动态创建Man对象的,这个对象也只是其中一个,有N多个这种对象。应该怎么利用反射创建,实在搞不定了,弄了1天还是没法解决。
是在扛不住了,没办法用了最笨的办法,if()else if 把我所有存在List可能的对象,都做了判断,然后创建具体的List<Man>或者其他,再进行赋值。
如果有哪位大佬知道怎么样解决这个问题,请回答下。我也多学习一些知识,谢谢了