当前位置: 首页 > news >正文

C# 类相同属性赋值

原文: C# 类相同属性赋值

做项目时偶尔B类赋值给A类,碰巧A和B类型很多属性字段名是一样的,或者只是大小写不一样,这是可以利用泛型,反射来写一个自动化赋值的方法。

下面方法不考虑大小写不一样的情况,如果要考虑,可以使用字符串方法 ToUpper() 、ToLower() 后,对比字段名是否一样。

 public class MapperModel
    {
        /// <summary>
        /// B对象相同属性赋值给A对象, 
        /// </summary>
        /// <typeparam name="A">类型A</typeparam>
        /// <typeparam name="B">类型B</typeparam>
        /// <param name="b">B对象</param>
        /// <returns>返回创建的新A对象</returns>
        public static A Mapper<A, B>(B b)
        {
            A a = Activator.CreateInstance<A>();
            try
            {
                Type Typeb = b.GetType();//获得类型  
                Type Typea = typeof(A);
                foreach (PropertyInfo bp in Typeb.GetProperties())//获得类型的属性字段  
                {
                    foreach (PropertyInfo ap in Typea.GetProperties())
                    {
                        if (ap.Name == bp.Name)//判断属性名是否相同  
                        {                          
                            if (ap.GetSetMethod()!= null)
                            {
                                if (bp.GetGetMethod()!=null)
                                {
                                    ap.SetValue(a, bp.GetValue(b, null), null);//获得b对象属性的值复制给a对象的属性   }
                                }
                                
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return a;
        }
    }

值得注意的地方,属性到底有没有Get或者Set方法 ?B属性Set访问器是非公共的或不存在 则会赋值时出现异常。同理:A属性如果 Get 访问器是非公共的或不存在,则取值时出现异常

因此上面使用了 GetSetMethod(),GetGetMethod()做判断。如果Get 、Set 访问器不能正常获取,则返回为null。

 

感觉下面的代码写法更可读:省略了一个循环

        /// <summary>
        /// 传入类型B的对象b,将b与a相同名称的值进行赋值给创建的a中        
        /// </summary>
        /// <typeparam name="A">类型A</typeparam>
        /// <typeparam name="B">类型B</typeparam>
        /// <param name="b">类型为B的参数b</param>
        /// <returns>拷贝b中相同属性的值的a</returns>
        public static A MapperTwo<A, B>(B b)
        {
            A a = Activator.CreateInstance<A>();
            try
            {
                Type Typeb = typeof(B);//获得类型  
                Type Typea = typeof(A);               
                foreach (PropertyInfo ap in Typea.GetProperties())
                {
                    System.Reflection.PropertyInfo bp = Typeb.GetProperty(ap.Name); //获取指定名称的属性
                    if (bp != null) //如果B对象也有该属性
                    {
                        if (ap.GetSetMethod() != null) //判断A对象是否有能用Set方法
                        {
                            if (bp.GetGetMethod() != null) //判断B对象是否有能用Get方法
                            {
                                ap.SetValue(a, bp.GetValue(b, null), null);//获得b对象属性的值复制给a对象的属性   
                            }
                        }
                    }
                  
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return a;
        }

 

相关文章:

  • MVC验证
  • UVa10305 拓扑排序
  • 专科程序员与本科程序员之间有什么区别?
  • HTTP协议
  • 算法一:动态规划
  • Redis学习笔记 - pipline(流水线、管道)
  • nginx模块学习七 http_refer 防盗链
  • 【转】复利的营销力量
  • Disruptor - 介绍(1)
  • ASIHTTPRequest使用指南---翻译稿
  • 观察者模式
  • 分表分库之一:分布式数据库的常见用法
  • 主流的CSS水平和垂直居中技术大全
  • 简单工厂、工厂方法和抽象工厂
  • SQLite 多线程模型实测分析
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [译]CSS 居中(Center)方法大合集
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【mysql】环境安装、服务启动、密码设置
  • golang中接口赋值与方法集
  • IDEA常用插件整理
  • java取消线程实例
  • Java应用性能调优
  • Logstash 参考指南(目录)
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Vue小说阅读器(仿追书神器)
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 回顾 Swift 多平台移植进度 #2
  • 坑!为什么View.startAnimation不起作用?
  • 力扣(LeetCode)357
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用putty远程连接linux
  • 温故知新之javascript面向对象
  • 一个项目push到多个远程Git仓库
  • 用简单代码看卷积组块发展
  • 7行Python代码的人脸识别
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​Linux·i2c驱动架构​
  • ​比特币大跌的 2 个原因
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • ###C语言程序设计-----C语言学习(6)#
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (10)STL算法之搜索(二) 二分查找
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (三)Honghu Cloud云架构一定时调度平台
  • (四) 虚拟摄像头vivi体验
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)基于IDEA的JAVA基础10
  • (转) ns2/nam与nam实现相关的文件
  • .htaccess配置常用技巧
  • .NET Core Web APi类库如何内嵌运行?
  • .net6 webapi log4net完整配置使用流程