反射工具类请参见: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. thinkjs——art-template模板用法

    前言: 概述之前先附上此正式版介绍地址:https://github.com/aui/artTemplate  or http://www.jq22.com/jquery-info1097,可以再看下 ...

  2. php第一例

    参考 例子 https://www.cnblogs.com/chinajins/p/5622342.html 配置多个网站 https://blog.csdn.net/win7system/artic ...

  3. <转>KMP算法详解

    看了好久的KMP算法,都一直没有看明白,直到看到了这篇博客http://www.tuicool.com/articles/e2Qbyyf让我瞬间顿悟. 如果你看不懂 KMP 算法,那就看一看这篇文章 ...

  4. MQTT 3.1协议非严肃反思录

    前言 MQTT 3.1协议在弱网络环境下(比如2G/3G等)表现不够好,因此才有了反思. 弱网环境下表现 手机等终端在弱网络环境下丢包情况会非常明显,连接MQTT Server成功率很低.相比单纯的请 ...

  5. JZOJ.5329【NOIP2017模拟8.22】时间机器

    Description

  6. javascript字符串函数

    substring() 从字符串中提取一些字符 <script type="text/javascript"> var str="Hello world!&q ...

  7. SignalR实现在线聊天室功能

    一.在线聊天室 1.新建解决方案 SignalROnlineChatDemo 2.新建MVC项目 SignalROnlineChatDemo.Web (无身份验证) 3.安装SignalR PM> ...

  8. 【BZOJ2007】[Noi2010]海拔 对偶图最短路

    [BZOJ2007][Noi2010]海拔 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看 ...

  9. 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树

    [BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...

  10. ios 在UIView上画图,线条

    1.画线条(实线,虚线) - (void)drawRect:(CGRect)rect {     CGContextRef context = UIGraphicsGetCurrentContext( ...