C#反射——模仿BeanUtil属性复制
反射工具类请参见: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属性复制的更多相关文章
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
有时遇到将数据传输对象转换成JSON串会将属性值为空的属性去掉,利用Java反射实现JavaBean对象数据传输对象的相同属性复制并初始化数据传输对象属性为空的属性,然后转换成JSON串 packag ...
- c# 如何通过反射 获取\设置属性值
c# 如何通过反射 获取\设置属性值 //定义类public class MyClass{public int Property1 { get; set; }}static void Main(){M ...
- Java循环一个对象的所有属性,并通过反射给这些属性赋值/取值
Java循环一个对象的所有属性,并通过反射给这些属性赋值/取值 说到循环遍历,最常见的遍历数组/列表.Map等.但是,在开发过程中,有时需要循环遍历一个对象的所有属性.遍历对象的属性该如何遍历呢?查了 ...
- java使用反射给对象属性赋值的两种方法
java反射无所不能,辣么,怎么通过反射设置一个属性的值呢? 主程序: /** * @author tengqingya * @create 2017-03-05 15:54 */ public cl ...
- [C#]反射遍历对象属性
/// <summary> /// C#反射遍历对象属性 /// </summary> /// <typeparam name="T">对象类型 ...
- cp 带着属性复制过去,
sudo cp -ra store_bak/* store/ -r 所有文件循环都复制 -a 带着属性复制过去
- C# 反射 设置实体属性
C# 反射 设置实体属性 http://blog.csdn.net/cestarme/article/details/6548126 C#反射设置属性值和获取属性值 http://www.cnblog ...
- neo4j 将一个节点的属性复制到另一个节点上
在使用Python操作Neo4j数据库的时候,经常会遇到重复的节点,需要将一个节点的属性复制到另一个节点,之后将该节点删除. def copy_node_properties(source_node_ ...
- java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包
首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; imp ...
随机推荐
- Django学习笔记 Django的工程目录
mysite├── manage.py 管理项目:包括数据库建立.服务器运行.测试……└── mysite ├── __init__.py ├── settings.py 配置文件:应用 ...
- 深入浅出Docker(二):Docker命令行探秘
1. Docker命令行 Docker官方为了让用户快速了解Docker,提供了一个交互式教程,旨在帮助用户掌握Docker命令行的使用方法.但是由于Docker技术的快速发展,此交互式教程已经无法满 ...
- poj3744 Scout YYF I[概率dp+矩阵优化]
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8598 Accepted: 2521 Descr ...
- js的字符串charAt()方法
//字符中的字符从左向右进行索引,由0开始,字符串中的空格也算在内 var string = "charAt find word position"; document.write ...
- Android动态加载ListView中的Item
我这周上网看到动态增加listview的每一项item的布局,今天抽空自己写了一个,方便自己日后使用,这个效果还是很不错的,用到了Adapter的notifyDataSetChanged()方法,当点 ...
- mysql格式化日期的函数
转自:https://www.cnblogs.com/duhuo/p/5650876.html mysql格式化日期 mysql查询记录如果有时间戳字段时,查看结果不方便,不能即时看到时间戳代表的 ...
- Floyd求最小环并求不同最小环的个数
FZU2090 旅行社的烦恼 Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u [Subm ...
- Mssql备份失败
Mssql备份失败出现如下提示 备份时先删除默认的备份设备,自己选择路径
- pta 习题集5-6 堆栈操作合法性
假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列.请编写程序,输入S ...
- JavaCSV之写CSV文件
与JavaCSV读CSV文件相对应,JavaCSV也可以用来写数据到CSV文件中. 1.准备工作 (1)第三方包库下载地址:https://sourceforge.net/projects/javac ...