通过反射获取实体集合属性值并赋值给另一个实体集合

简介:                   在List提供的方法中,提供了将一个类型的List转换成为另一个List类型的方法,如下:         //构造类1集合 TestClass1 test1 = new TestClass1()...


                  在List提供的方法中,提供了将一个类型的List转换成为另一个List类型的方法,如下:


       

            //构造类1集合
            TestClass1 test1 = new TestClass1();
            List<TestClass1> class1 = new List<TestClass1>();

            test1 .Name ="lhc";
            test1 .ID =2;


            class1.Add(test1);


            //构造类2集合
            TestClass2 test2 = new TestClass2();
            List<TestClass2> class2 = new List<TestClass2>();

            class2.Add(test2);

            //两个集合相互转换
           class2 = class1.ConvertAll<TestClass2>(new Converter<TestClass1, TestClass2>(c1 => new TestClass2() { Name=c1.Name}));//convert里面指定转换规则

             

                     如上代码:利用List的ConvertAll方法,可以将两种类型的集合进行相互转换,但是要自己在Converter的构造放中,定义转换规则,如上代码中的转换规则为一个Lambda表达式,指定了将属性的对应关系。


             这种方法实用性比较普遍,但是,对于特殊的情况,比如,在WCF中,我定义的数据契约和Model层实体的属性名称是一致的,这时候,如果我们手动写这个转换规则的话,就非常麻烦了,在这里,我们扔掉这个方法,利用泛型手动写一个通用的方法:


         

 #region 两个集合转换过程
            public static List<M> ListInputToOutput<T, M>(List<T> objTlist)
                where T : new()
                where M : new()
            {
                //定义返回的集合
                List<M> ListM = new List<M>();

                //定义临时M类变量
                M TempM = new M();

                foreach (T item in objTlist)
                {
                    TempM = InputToOutput<T, M>(item);

                    ListM.Add(TempM);//加入结果集合
                }

                return ListM;

            } 
        #endregion

        #region 单个实体转换过程
            //转换规则
            //T代表要待转换的对象
            //M代表转换后的对象
            //参数中传入被转换的对象
            public static M InputToOutput<T, M>(T ObjT)
                where T : new()
                where M : new()
            // where M:ICollection<M> 
            {
                string tempName = string.Empty;  //临时保存属性名称

                //获取T的所有属性和值
                //T t = new T();
                M Result = new M();  //定义返回值
                PropertyInfo[] propertys = Result.GetType().GetProperties();


                //循环获取T的属性及其值
                foreach (PropertyInfo pr in propertys)
                {

                    tempName = pr.Name;//将属性名称赋值给临时变量
                    PropertyInfo findPro = ObjT.GetType().GetProperty(tempName);//从带转换实体获取属性

                    if (findPro != null)  //如果获取到了:尝试执行赋值过程
                    {
                        if (!pr.CanWrite) continue;  //如果属性不可写,跳出


                        //取值:参数不匹配-------------
                        object value = findPro.GetValue(ObjT, null);

                        //如果为非空,则赋值给对象的属性
                        if (value != DBNull.Value)
                            pr.SetValue(Result, value, null);


                    }



                }



                return Result;


            }
        
        #endregion


           这段代码具体思路是:获取M实体的属性集合,然后去T的属性里面去找,如果T内含有此属性,那么,就将T的此属性值赋值给M的这个属性,如果没有就略过。


       动态获取属性值的过程感觉见的很多了,但是尤其要注意的是where约束条件这部分,因为泛型毕竟是动态编译的时候才会确定类型,但是在代码中可能用到类型的一些属性方法,在这种情况下,就必须添加约束条件了。



 





       

         



目录
相关文章
|
2月前
多层嵌套对象的解构赋值时,如果对象的属性名相同怎么办?
在多层嵌套对象的解构赋值中遇到属性名相同时,使用别名是一种有效的解决方法,它能够帮助我们准确地提取和使用对象中的数据,避免变量名冲突,提高代码的质量和可维护性。
67 7
|
4月前
|
安全 C# 索引
C#一分钟浅谈:属性与索引器的定义
本文深入浅出地介绍了C#编程中的属性和索引器。属性让字段更安全,通过访问器方法在读写时执行额外操作,如验证数据有效性;索引器则赋予类数组般的访问方式,支持基于索引的数据访问模式。文章通过示例代码展示了如何定义及使用这两种特性,并提供了常见问题及其解决方案,帮助读者写出更健壮、易维护的代码。希望读者能从中学习到如何有效利用属性和索引器增强C#类的功能性。
114 12
|
8月前
2020-10-10 数组和对象的区分方法
2020-10-10 数组和对象的区分方法
根据数组中对象的属性值进行排序
根据数组中对象的属性值进行排序
90 0
对象定义-解构-枚举属性遍历以及对象内函数
对象定义-解构-枚举属性遍历以及对象内函数
77 0
|
编译器 C++
C++类对象构造顺序
C++类对象构造顺序
60 0
C++类对象构造顺序
获取一个集合中(集合中存贮的是对象)根据对象的某一个属性获取对应数据
获取一个集合中(集合中存贮的是对象)根据对象的某一个属性获取对应数据
115 0
|
Java 数据库
java反射机制查找类的属性并赋值
先说一下需求:最近做一个项目其中需要将前台传来的数组存到数据库,但是这个表里有15个字段,集合是不固定的,然后要把这个集合的数值赋给这个类的相应属性,然后存到数据库中。集合长度应小于等于这个类属性的个数。
338 0
|
存储
集合作为函数参数传参时创建新集合对象的作用
易错点——List集合集合作为函数参数传参时创建新集合对象的作用
183 0
|
安全 Java 容器
对象的组合
对象的组合
113 0