zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
  • 相关阅读:
    数据库Mysql给用户赋予操作表的权限
    C# log4net日志分等级打日志
    C# 将字符串转为函数名
    C# winform无法拖动控件
    C# 程序获取管理员方法
    C# 生成程序目录避免生成多余的XML和pdb
    C# 快速获取一个月的天数或最后一天
    正则
    C# 根据服务名打开所在文件夹
    330 div+css Experience
  • 原文地址:https://www.cnblogs.com/threadj/p/10535839.html
Copyright © 2011-2022 走看看