• C# 反射


    /// <summary>
    /// 封装反射的一些方法
    /// </summary>
    public class Reflection
    {
    /// <summary>
    /// 根据源对象的属性填充目标对象的对应字段
    /// </summary>
    /// <param name="source">获取数据的源对象</param>
    /// <param name="target">填充数据的目标对象</param>
    public static void GetViewModelProperties(object source, object target)
    {
    if (source != null)
    {
    foreach (PropertyInfo item in target.GetType().GetProperties())
    {
    var attr = source.GetType().GetProperties().FirstOrDefault(p => p.Name == item.Name);
    if (attr != null)
    {
    var value = attr.GetValue(source, null);
    // 不为null或空的数据才填入,确保有意义
    if (value != null && !string.IsNullOrEmpty(value.ToString()))
    item.SetValue(target, value, null);

    }
    }
    }
    }

    /// <summary>
    /// 获取修改后不同字段对应的DisplayName特性和修改前对应的值
    /// </summary>
    /// <param name="bObj">修改前的对象</param>
    /// <param name="AObj">修改后的对象</param>
    /// <returns>特性名和修改前的值组合字符串," , "分割</returns>
    public static string GetDisplayNameFromComparedObject(object bObj, object AObj)
    {
    string recordStr = string.Empty;
    foreach (var item in AObj.GetType().GetProperties())
    {
    var modelAttr = bObj.GetType().GetProperty(item.Name);
    object oldValue = modelAttr.GetValue(bObj, null);
    object value = item.GetValue(AObj, null);
    if (oldValue == null || value == null)
    continue;
    if (!oldValue.Equals(value))
    {
    // 获取DisplayName特性值
    object[] objs = item.GetCustomAttributes(typeof(DisplayNameAttribute), true);
    if (objs.Length > 0)
    {
    DisplayNameAttribute attr = objs[0] as DisplayNameAttribute;
    if (attr != null)
    recordStr += attr.DisplayName + ":" + oldValue + " , ";
    }
    }
    }
    return recordStr;
    }
    /// <summary>
    /// 根据列表生成表头为DisplayName的DataTable
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="lst"></param>
    /// <returns></returns>
    public static DataTable GetDisplayNameToDataTable<T>(List<T> lst)
    {
    DataTable dt = new DataTable();
    foreach (var item in typeof(T).GetProperties())
    {
    string displayName = string.Empty;
    object[] objs = item.GetCustomAttributes(typeof(DisplayNameAttribute), true);
    if (objs.Length > 0)
    displayName = (objs[0] as DisplayNameAttribute).DisplayName;

    dt.Columns.Add(new DataColumn(displayName, item.PropertyType));
    }

    foreach (var report in lst)
    {
    DataRow dr = dt.NewRow();
    foreach (var item in report.GetType().GetProperties())
    {
    string displayName = string.Empty;
    object[] objs = item.GetCustomAttributes(typeof(DisplayNameAttribute), true);
    if (objs.Length > 0)
    displayName = (objs[0] as DisplayNameAttribute).DisplayName;

    dr[displayName] = item.GetValue(report, null);
    }
    dt.Rows.Add(dr);
    }
    return dt;
    }
    }

  • 相关阅读:
    学习笔记CSS
    悲剧,当用cywin 写Linux脚本
    .net中控件的命名规则和一些词语的简称(转)(I)
    PyMining开源中文文本数据挖掘平台 Ver 0.2发布
    TCP和UDP的区别(转)
    发一道我今天遇到C面试题(求完美解)
    C#三种定时器的实现转载
    window 拷贝 linux 远程
    datepicker 日月年
    Oracle PL/SQL练习题总目录 hl3292
  • 原文地址:https://www.cnblogs.com/louby/p/4852743.html
Copyright © 2020-2023  润新知