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 ...
随机推荐
- combobox组合框
最近在改BUG的时候发现,combobox组合框如果选择的是Dropdown模式在初始化combobox对象时候有如下操作 1.SetDlgItemInt(IDC_WB_FONTSIZECOMBOX, ...
- sql查询数据库中所有表名
查询数据库里所有表名和字段名的语句SQL 查询所有表名:SELECT NAME FROM SYSOBJECTS WHERE TYPE='U'SELECT * FROM INFORMATION_SCHE ...
- Go基础---->go的基础学习(四)
这里简单的介绍一下go中的关于多线程的知识. Go中的多线程 一.go中简单的并发例子 package main import ( "fmt" "time" ) ...
- android基础组件---->Button的使用
按钮由文本或图标(或文本和一个图标)组成,当用户触摸到它时,会发生一些动作.今天我们开始Button的学习.少年的爱情永远不够用,一杯酒足以了却一件心事. Button的简要说明 根据你是否想要一个带 ...
- Docker源码分析(六):Docker Daemon网络
1. 前言 Docker作为一个开源的轻量级虚拟化容器引擎技术,已然给云计算领域带来了新的发展模式.Docker借助容器技术彻底释放了轻量级虚拟化技术的威力,让容器的伸缩.应用的运行都变得前所未有的方 ...
- LeetCode——Binary Search Tree Iterator
Description: Implement an iterator over a binary search tree (BST). Your iterator will be initialize ...
- hdu4976 A simple greedy problem.
A simple greedy problem. Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ...
- nohop以及后台运行的相关集合
本文参考:https://blog.csdn.net/u011095110/article/details/78666833 1. 后台运行一个命令: & tar -czvf /mnt/aa. ...
- 代码片段,Lucene的高亮显示
代码高亮显示是通过在搜索到的Term中把匹配了用户输入的关键字的周围加上一些标记来实现(比如,关键字是 "中华" 查到的一个Term是 "中华人民共和国",则把 ...
- oracle rank over partition by
转自:https://www.cnblogs.com/wingsless/archive/2012/02/04/2338292.html rank() over(partition)的使用 有的时 ...