zoukankan      html  css  js  c++  java
  • 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;
    }
    }

  • 相关阅读:
    [转载]ASIHTTPRequest使用介绍
    mac下显示隐藏文件的方法
    Proguard 4.x error java.lang.ArrayIndexOutOfBoundsException
    【iPhone开发】说说Xcode4中xib绑定的原理
    【转】ObjectiveC 属性特性(assign , retain , copy , readonly , readwrite , atomic , nonatomic)
    xcode 4.X无法连接svn的问题
    .NET System.Timers.Timer的原理和使用(开发定时执行程序)
    步步为营 SharePoint 开发学习笔记系列 七、SharePoint Timer Job 开发
    步步为营 SharePoint 开发学习笔记系列 六、EditorPart开发
    C# FileSystemWatcher 在监控文件夹和文件时的用法
  • 原文地址:https://www.cnblogs.com/louby/p/4852743.html
Copyright © 2011-2022 走看看