反射工具类请参见:https://www.cnblogs.com/threadj/p/10535796.html

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Reflection; namespace ReligionServer.util {
public class BeanUtil { /// <summary>
/// 两个对象的相同属性复制, 会将Source中与Target属性名相同的属性赋值(且属性类型相同), target中别的属性值不会被破坏
/// </summary>
/// <param name="source"></param>
/// <param name="target"></param>
/// <returns></returns>
public static Object PropCopy(Object source, Object target) { //在后来的修改之后, 返回List, 且包含当前类和除开Object的所有父类的属性
//List<FieldInfo> sourceFields = ReflectionUtil.GetFileldS(source.GetType());
//List<FieldInfo> targetFields = ReflectionUtil.GetFileldS(target.GetType()); foreach (FieldInfo sourceItem in ReflectionUtil.GetFileldS(source.GetType())) {
foreach (FieldInfo targetItem in ReflectionUtil.GetFileldS(target.GetType())) {
if (sourceItem.Name.Equals(targetItem.Name) && sourceItem.FieldType.Equals(targetItem.FieldType)) {
//targetItem.SetValue(target, sourceItem.GetValue(source).ToString().Trim());//可能出现空指针, 字段的类型也应该保持一致, 所以不应该ToString 和 Trim
targetItem.SetValue(target, sourceItem.GetValue(source));
break;
}
}
}
return target;
}
/// <summary>
/// 两个对象的相同属性复制, 会将Source中与Target属性名相同的属性赋值(且属性类型相同), target中别的属性值不会被破坏
/// 如果属性值相同的则不进行复制, withOutNull参数为true, 那么source中为null或者为""的属性则不复制,
/// 暂时没有测试
/// </summary>
/// <param name="source"></param>
/// <param name="target"></param>
/// <param name="withOutNull"></param>
/// <returns></returns>
public static Object PropCopyWithOutSame(Object source, Object target, bool withOutNull) { //在后来的修改之后, 返回List, 且包含当前类和除开Object的所有父类的属性
//List<FieldInfo> sourceFields = ReflectionUtil.GetFileldS(source.GetType());
//List<FieldInfo> targetFields = ReflectionUtil.GetFileldS(target.GetType()); foreach (FieldInfo sourceItem in ReflectionUtil.GetFileldS(source.GetType())) {
foreach (FieldInfo targetItem in ReflectionUtil.GetFileldS(target.GetType())) {
if (sourceItem.Name.Equals(targetItem.Name) && sourceItem.FieldType.Equals(targetItem.FieldType)) {
//targetItem.SetValue(target, sourceItem.GetValue(source).ToString().Trim());//可能出现空指针, 字段的类型也应该保持一致, 所以不应该ToString 和 Trim
if (sourceItem.GetValue(source) != targetItem.GetValue(target)) {//这里判断相等不能使用Equals, 因为很有可能出现空指针异常
if (withOutNull) {
bool flag = IsEmpty(sourceItem.FieldType, sourceItem.GetValue(source));
if (!flag) {
targetItem.SetValue(target, sourceItem.GetValue(source));
}
} else {
targetItem.SetValue(target, sourceItem.GetValue(source));
}
break;
}
}
}
}
return target;
} public static bool IsEmpty(Type type, Object value) {
bool flag = true;
if (type.Equals(typeof(DateTime))) {
flag = value == null;
} else if (type.Equals(typeof(MongoDB.Bson.BsonValue))) {
flag = MongoDB.Bson.BsonValue.Create(value) == null;
} else if (type.Equals(typeof(String))) {
flag = CommonUtil.IsEmpty(Convert.ToString(value));
} else {
flag = value == null;
}
return flag;
}
}
}

C#反射——模仿BeanUtil属性复制的更多相关文章

  1. 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils

    有时遇到将数据传输对象转换成JSON串会将属性值为空的属性去掉,利用Java反射实现JavaBean对象数据传输对象的相同属性复制并初始化数据传输对象属性为空的属性,然后转换成JSON串 packag ...

  2. c# 如何通过反射 获取\设置属性值

    c# 如何通过反射 获取\设置属性值 //定义类public class MyClass{public int Property1 { get; set; }}static void Main(){M ...

  3. Java循环一个对象的所有属性,并通过反射给这些属性赋值/取值

    Java循环一个对象的所有属性,并通过反射给这些属性赋值/取值 说到循环遍历,最常见的遍历数组/列表.Map等.但是,在开发过程中,有时需要循环遍历一个对象的所有属性.遍历对象的属性该如何遍历呢?查了 ...

  4. java使用反射给对象属性赋值的两种方法

    java反射无所不能,辣么,怎么通过反射设置一个属性的值呢? 主程序: /** * @author tengqingya * @create 2017-03-05 15:54 */ public cl ...

  5. [C#]反射遍历对象属性

    /// <summary> /// C#反射遍历对象属性 /// </summary> /// <typeparam name="T">对象类型 ...

  6. cp 带着属性复制过去,

    sudo cp -ra store_bak/* store/ -r   所有文件循环都复制 -a  带着属性复制过去

  7. C# 反射 设置实体属性

    C# 反射 设置实体属性 http://blog.csdn.net/cestarme/article/details/6548126 C#反射设置属性值和获取属性值 http://www.cnblog ...

  8. neo4j 将一个节点的属性复制到另一个节点上

    在使用Python操作Neo4j数据库的时候,经常会遇到重复的节点,需要将一个节点的属性复制到另一个节点,之后将该节点删除. def copy_node_properties(source_node_ ...

  9. java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包

    首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; imp ...

随机推荐

  1. /etc/rc.d/rc.local

    /etc/rc.d/rc.local 用于用户自定义开机启动程序,可以往里写开机要执行的命令或脚本,线上的配置如下: [root@localhost ~]$ cat /etc/rc.d/rc.loca ...

  2. linux系统usb挂载

    本次例程的环境是在FC6下,通过终端操作的. 注意要挂载U盘需要有管理员的权限. 切换成管理员,输入: su root 然后输入管理员密码,进行密码认证: 成功后,先在 /mnt 下建立一个名叫USB ...

  3. 《C++ Primer Plus》15.4 RTTI 学习笔记

    运行时类型识别RTTI(Runtime Type Identification) C++有三个支持RTTI的元素.* 如果可能的话,dynamic_cast运算符将使用一个指向基类的指针来生成一个指向 ...

  4. 好用的在线Markdown编辑器

    dillinger.io 支持在线编辑,导出为html格式等.

  5. cocos2dx游戏--欢欢英雄传说--添加游戏背景

    经过一段时间的学习cocos2dx,接下来我想要实践开发一个小游戏,我把它命名为“欢欢英雄传说”,项目名将取为HuanHero.环境:cocos2dx环境:cocos2d-x 3.11.1IDE:Co ...

  6. bash: ./t.sh:/bin/bash^M:损坏的解释器: 没有那个文件或目录

    有时候编写脚本时会出现类似标题列出的错误,这个问题大多数是因为你的脚本文件在windows下编辑过.windows下,每一行的结尾是\n\r,而在linux下文件的结尾是\n,那么你在windows下 ...

  7. outline的兼容性及使用限制

    outline 和 border的区别: outline不占据文档空间,border占据文档空间. outline无法单独设置上下左右,只要设置outline,必须所有的边都设置:border可以设置 ...

  8. 重构(Refactoring)技巧读书笔记(General Refactoring Tips)

    重构(Refactoring)技巧读书笔记 之一 General Refactoring Tips, Part 1 本文简要整理重构方法的读书笔记及个人在做Code Review过程中,对程序代码常用 ...

  9. SQLPlus的两种登录方式的不同效果

    Windows 8,Oralce11g,命令行 1.输入“sqlplus”,回车,提示:请输入用户名,输入用户名,回车,提示,请输入口令,输入口令后,回车,报ORA-12560:TNS:协议适配器错误 ...

  10. JS原生ajax

    原文链接:http://caibaojian.com/ajax-jsonp.html 一.JS原生ajax ajax:一种请求数据的方式,不需要刷新整个页面: ajax的技术核心是 XMLHttpRe ...