bear_csdn 2022-07-17 01:47 采纳率: 50%
浏览 74
已结题

c# 反射创建泛型对象

问题遇到的现象和发生背景

利用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>或者其他,再进行赋值。

如果有哪位大佬知道怎么样解决这个问题,请回答下。我也多学习一些知识,谢谢了 

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 7月25日
    • 修改了问题 7月17日
    • 创建了问题 7月17日

    悬赏问题

    • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
    • ¥20 ensp怎么配置让PC1和PC2通讯上
    • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
    • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
    • ¥15 请各位帮我看看是哪里出了问题
    • ¥15 vs2019的js智能提示
    • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
    • ¥15 uniapp的h5项目写一个抽奖动画
    • ¥15 hadoop中启动hive报错如下怎么解决
    • ¥15 如何优化QWebEngineView 加载url的速度