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; }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Java编程详解-基于 dubbo 的分布式架构
前言 现在越来越多的互联网公司还是将自己公司的项目进行服务化,这确实是今后项目开发的一个趋势,就这个点再凭借之前的SSM项目来让第一次接触的同学能快速上手。 浅谈分布式架构 分布式架构 单看这个名字给人的感觉就是高逼格,但其实从历史的角度来分析一下就比较明了了。 我们拿一个电商系统来说: 单系统 对于一个刚起步的创业公司项目肯定是追求越快完成功能越好,并且用户量也不大。 这时候所有的业务逻辑都是在一个项目中就可以满足。 垂直拆分-多应用 当业务量和用户量发展到一定地步的时候,这时一般会将应用同时部署到几台服务器上,在用户访问的时候使用 Nginx 进行反向代理和简单的负载均衡。 SOA服务化 当整个系统以及发展的足够大的时候,比如一个电商系统中存在有: 用户系统 订单系统 支付系统 物流系统 等系统。 如果每次修改了其中一个系统就要重新发布上线的话那么耦合就太严重了。 所以需要将整个项目拆分成若干个独立的应用,可以进行独立的开发上线实现快速迭代。 如上图所示每个应用之间相互独立,每个应用可以消费其他应用暴露出来的服务,同时也对外提供服务。 从架构的层面简单的理解了,接下来看看如何...
-
下一篇
Java编程笔记-深入了解一下Redis的内存模型
前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符串、哈希、列表、集合、有序集合),丰富的类型是Redis相对于Memcached等的一大优势。在了解Redis的5种对象类型的用法和特点的基础上,进一步了解Redis的内存模型,对Redis的使用有很大帮助,例如: 1、估算Redis内存使用量。目前为止,内存的使用成本仍然相对较高,使用内存不能无所顾忌;根据需求合理的评估Redis的内存使用量,选择合适的机器配置,可以在满足需求的情况下节约成本。 2、优化内存占用。了解Redis内存模型可以选择更合适的数据类型和编码,更好的利用Redis内存。 3、分析解决问题。当Redis出现阻塞、内存占用等问题时,尽快发现导致问题的原因,便于分析解决问题。 这篇文章主要介绍Redis的内存模型(以3.0为例),包括Redis占用内存的情况及如何查询、不同的对象类型在内存中的编码方式、内存分配器(jemalloc)、简单动态字符串(SDS)、RedisO...
相关文章
文章评论
共有0条评论来说两句吧...