在开发过程中经常遇到两个Model长得一模一样,但就是订单的类型不一样。常用到的框架结构是MVC中:业务逻辑层的Model与View层的Model的装换。每层定义属于自己Model,实现层与层之间的解耦。最简单小白的方法就是在每个要赋值的地方 new 一个 object, 之后实现一个一个赋值。

 

尝试写公用的方法

  A.通过反射获得原object中的内容,之后创建一个泛型的目标object对象,之后进行一一复制; 自己实现的实例如下:

                      最简单的只能实现一层转换 不支持list 结合的转换

/// <summary>
///OTO object到object 的转换
/// </summary>
/// <typeparam name="T1">目标类型 </typeparam>
/// <param name="sourceObject">要装换的object</param>
/// <param name="excludedProperties">装换的object中不需要装换的属性名称</param>
/// <returns></returns>

public static T1 MapProperties<T1>(object sourceObject, string[] excludeProperties = null) where T1 : class
{
var targetType = typeof(T1);
var targetObject = Activator.CreateInstance(targetType);
foreach (var sourceProperty in sourceObject.GetType().GetProperties())
{
if (excludeProperties != null && excludeProperties.Contains(sourceProperty.Name))
{
continue;
}

var targetObjectProperty = targetObject.GetType().GetProperty(sourceProperty.Name);
if (targetObjectProperty != null && sourceProperty.PropertyType == targetObjectProperty.PropertyType)
{
var sourceValue = sourceProperty.GetValue(sourceObject);
targetObjectProperty.SetValue(targetObject, sourceValue);
}
}
return (T1)targetObject;
}

 

                        能实现一层与简单2层的(2层中引用对象的类型一致),不支持list集合的方式

               /// <summary>

/// 转换两个不同类型但是成员相同的对象,包含私有字段的赋值
/// </summary>
/// <typeparam name="T">目标对象</typeparam>
/// <param name="source">待转换对象</param>
/// <returns></returns>
public static T CopySameFieldsObject<T>(Object source) where T: class
{
Type srcT = source.GetType();
Type destT = typeof(T);

// 构造一个要转换对象实例
Object instance = destT.InvokeMember("", BindingFlags.CreateInstance, null, null, null);

// 这里指定搜索所有公开和非公开的字段
FieldInfo[] srcFields = srcT.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

// 将源头对象的每个字段的值分别赋值到转换对象里,因为假定字段都一样,这里就不做容错处理了
foreach (FieldInfo field in srcFields)
{
 destT.GetField(field.Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).
 SetValue(instance, field.GetValue(source));
}

return (T)instance;
}

              

 1     public class PagerModel 
 2     {
 3         public PagerModel()
 4         {
 5             TastPageModel = new TastPageModel();
 6             TastPageModels = new List<TastPageModel>();
 7         }
 8 
 9         public int CurrentPage { get; set;}
10         public int PageSize { get; set;}
11         public int Total { get; set;}
12         public int TotalPage 
13         {
14             get
15             {
16                 return (this.Total + this.PageSize - 1) / this.PageSize;
17             }
18         }
19         //简单序列化对象
20         public override string ToString()
21         {
22             return JsonConvert.SerializeObject(this);
23         }
24         public TastPageModel TastPageModel;
25 
26         public List<TastPageModel> TastPageModels;
27 
28     }
29 
30     public class TastPageModel
31     {
32         public  string TastString { get; set;}
33 
34         public Object ObjTry { get; set;}  
35     }
36 
37     public class TastPageModel2
38     {
39         public string TastString { get; set; }
40 
41         public Object ObjTry { get; set; }
42     }
43     public class PagerModel2
44     {
45         public PagerModel2() {
46             TastPageModel = new TastPageModel();
47             TastPageModels = new List<TastPageModel2>();
48         }
49 
50         public TastPageModel TastPageModel;
51         public List<TastPageModel2> TastPageModels;
52         public int CurrentPage { get; set; }
53         public int PageSize { get; set; }
54         public int Total { get; set; }
55         public int TotalPage
56         {
57             get
58             {
59                 return (this.Total + this.PageSize - 1) / this.PageSize;
60             }
61         }
62         //简单序列化对象
63         public override string ToString()
64         {
65             return JsonConvert.SerializeObject(this);
66         }
67     }
68  
69 
70 ----运行代码
71 
72  public static void MapTest()
73         {
74             var model = new PagerModel()
75             {
76                 Total=100,
77                 PageSize = 20
78             };
79             model.TastPageModel.TastString = "aaaaa";
80 
81 
82              model.TastPageModels.Add(new TastPageModel() {
83                             TastString = "bbbb",
84                             ObjTry = new  {
85                                oa="ccccc",
86                             }
87                         });
88 
89             var model3 = ModelMap.CopySameFieldsObject<PagerModel2>(model);
90             //var model2 = ModelMap.MapProperties<PagerModel2>(model);
91         }
view code

相关文章: