做项目时偶尔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;
}

估计我写的就是下面的原理,序列化,反序列化,不区分大小写。当然,不能否定上面的内容。

public static A MapperTwo<A, B>(B b)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<A>(Newtonsoft.Json.JsonConvert.SerializeObject(b));
}

C# 类相同属性赋值的更多相关文章

  1. 31 反射方式给类的属性赋值 和 对象赋值(clone)

    1.配置类 package com.da.tool.util.configuration.reflect; /** */ public class JobInfo { private String j ...

  2. 107-PHP类成员属性赋值

    <?php class mao{ //定义猫类 public $age; //定义多个成员属性 protected $weight; private $color; } $mao1=new ma ...

  3. 110-PHP类成员属性赋值

    <?php class mao{ //定义猫类 public $age=0; //定义多个属性并初始化 public $weight=50; public $color='white'; } $ ...

  4. iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值

    在上篇博客<iOS开发之使用Runtime给Model类赋值>中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property ...

  5. 我写的RunTime函数之一,为类的某个属性赋值以及方法交换

      1,为属性赋值 #import <UIKit/UIKit.h> @interface UIViewController (RunTime) - (BOOL)setPropertyVal ...

  6. Android利用反射机制为实体类属性赋值

    在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面 ...

  7. 实体类相同属性间赋值与如何判断实体类中是否所有的字段都为null

    1,实体类相同属性间赋值 /// <summary> /// 将实体2的值动态赋值给实体1(名称一样的属性进行赋值) /// </summary> /// <param ...

  8. java 面向对象(九):类的结构:构造器(一)简介;属性赋值顺序;JavaBean的概念

    1.构造器(或构造方法):Constructor构造器的作用: * 1.创建对象 * 2.初始化对象的信息2.使用说明: * 1.如果没显式的定义类的构造器的话,则系统默认提供一个空参的构造器 * 2 ...

  9. IL接口和类的属性

    上一篇文章学习了IL的入门,接下来我们再通过两个例子来了解下类的属性.构造函数以及接口的使用 一.类的属性.构造函数 1.先看下我们要构建的类的C#代码,然后再进行IL的实现,示例代码如下: [Ser ...

随机推荐

  1. spring深入学习(五)-----spring dao、事务管理

    访问数据库基本是所有java web项目必备的,不论是oracle.mysql,或者是nosql,肯定需要和数据库打交道.一开始学java的时候,肯定是以jdbc为基础,如下: private sta ...

  2. xpath和lxml类库

    1. xpath和lxml lxml是一款高性能的 Python HTML/XML 解析器,我们可以利用XPath,来快速的定位特定元素以及获取节点信息 2. 什么是xpath XPath (XML ...

  3. Html5与Css3知识点拾遗(三)

    文本 small:包括免责申明.注意事项.法律限制.版权信息,只适用于短于,常包含在页面级的footer里 H5对i和b的重新定义 b:提醒文字.不传达任何额外的语气.文档摘要关键词.评论中的产品名. ...

  4. Vuejs——(4)v-if、v-for

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   (二十)v-if ①标准v-if用法 简单来说,该值为true则显示该标签,为false则不显示 ...

  5. 从文本中读取字符——feof函数问题

    feof()函数 函数原型:int feof(FILE *fp): 函数功能:检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()函数清除 (函数feof ...

  6. What does git fsck stand for?

    fsck -> File System ChecK https://stackoverflow.com/questions/21151945/what-does-git-fsck-stand-f ...

  7. callback vs async.js vs promise vs async / await

    需求: A.依次读取 A|B|C 三个文件,如果有失败,则立即终止. B.同时读取 A|B|C 三个文件,如果有失败,则立即终止. 一.callback 需求A: let read = functio ...

  8. 机器学习技法笔记:13 Deep Learning

    Roadmap Deep Neural Network Autoencoder Denoising Autoencoder Principal Component Analysis Summary

  9. 课程四(Convolutional Neural Networks),第四 周(Special applications: Face recognition & Neural style transfer) —— 1.Practice quentions

    [解释] This allows us to learn to predict a person’s identity using a softmax output unit, where the n ...

  10. Linux学习笔记之八————vim编辑器常用命令总结

    <1>从命令行模式到插入模式 i  :在光标前插入 a :在光标后插入 I  :在光标所处在的行的行首 A :在光标所处在的行的末尾 o  :在光标所处在的行的下一行 行首 O :在光标所 ...