zoukankan      html  css  js  c++  java
  • C#用反射实现两个类的对象之间相同属性的值的复制

    在进行实体转换操作的时候如果需要在对两个实体之间两个属性字段差不多相同的类要进行一个互相的转换,我们要把a对象的所有字段的值都复制给b对象,我们只能用b.属性=a.属性来写,如果属性字段太多的话,就要写很多行复制语句,麻烦还容易漏掉一些,这个时候可以利用c#的反射来实现复制。我们可以写这样一个利用泛型的映射函数。

    1.适用于创建实体的时候从一个实体作为数据源赋值。

     1  /// <summary>
     2         /// 反射实现两个类的对象之间相同属性的值的复制
     3         /// 适用于初始化新实体
     4         /// </summary>
     5         /// <typeparam name="D">返回的实体</typeparam>
     6         /// <typeparam name="S">数据源实体</typeparam>
     7         /// <param name="s">数据源实体</param>
     8         /// <returns>返回的新实体</returns>
     9         public static D Mapper<D, S>(S s)
    10         {
    11             D d = Activator.CreateInstance<D>(); //构造新实例
    12             try
    13             {
    14                 var Types = s.GetType();//获得类型  
    15                 var Typed = typeof(D);
    16                 foreach (PropertyInfo sp in Types.GetProperties())//获得类型的属性字段  
    17                 {
    18                     foreach (PropertyInfo dp in Typed.GetProperties())
    19                     {
    20                         if (dp.Name == sp.Name && dp.PropertyType == sp.PropertyType && dp.Name!= "Error" && dp.Name != "Item")//判断属性名是否相同  
    21                         {
    22                             dp.SetValue(d, sp.GetValue(s, null), null);//获得s对象属性的值复制给d对象的属性  
    23                         }
    24                     }
    25                 }
    26             }
    27             catch (Exception ex)
    28             {
    29                 throw ex;
    30             }
    31             return d;
    32         }

    2.适用于没有创建实体,两个实体之间数据的转换。

     1  /// <summary>
     2         /// 反射实现两个类的对象之间相同属性的值的复制
     3         /// 适用于没有新建实体之间
     4         /// </summary>
     5         /// <typeparam name="D">返回的实体</typeparam>
     6         /// <typeparam name="S">数据源实体</typeparam>
     7         /// <param name="d">返回的实体</param>
     8         /// <param name="s">数据源实体</param>
     9         /// <returns></returns>
    10         public static D MapperToModel<D, S>(D d,S s)
    11         {
    12             try
    13             {
    14                 var Types = s.GetType();//获得类型  
    15                 var Typed = typeof(D);
    16                 foreach (PropertyInfo sp in Types.GetProperties())//获得类型的属性字段  
    17                 {
    18                     foreach (PropertyInfo dp in Typed.GetProperties())
    19                     {
    20                         if (dp.Name == sp.Name && dp.PropertyType == sp.PropertyType && dp.Name != "Error" && dp.Name != "Item")//判断属性名是否相同  
    21                         {
    22                             dp.SetValue(d, sp.GetValue(s, null), null);//获得s对象属性的值复制给d对象的属性  
    23                         }
    24                     }
    25                 }
    26             }
    27             catch (Exception ex)
    28             {
    29                 throw ex;
    30             }
    31             return d;
    32         }
  • 相关阅读:
    [uva 11762]Race to 1[概率DP]
    为什么webview.loadUrl("javascript:function() ")不执行?
    IPhone多视图切换
    IAA32过程调用保护规则注册
    c#扩展方法简单
    Spring综合Struts2
    简单的讲Erlang一些运营商
    leetcode先刷_Pascal&#39;s Triangle II
    王立平--RemoteView
    js到字符串数组,实现阵列成一个字符串
  • 原文地址:https://www.cnblogs.com/soulmate/p/7923294.html
Copyright © 2011-2022 走看看