在开发过程中经常遇到两个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 }