(一)前言
當不同命名空間下的兩個類具有相同的屬性,並且需要進行相互賦值時,如下圖中的 Jasen.Core.Info類的實例與Jasen.Core.Test.Info類的實例需要相互賦值時,按照一般的思路直接賦值就可 以了。通常,這種情況在調用Web Service的時候比較常見。當需要轉換的類很多時,亦或者需要轉換的屬性 很多時,我們就需要根據一定的規則來對這種場景來進行設計了,誰也不會傻布拉吉的一個一個屬性的去給對 象賦值。
(二)ObjectMapper 類負責對象之間相對應的屬性間的賦值
/// <summary> /// /// </summary> public class ObjectMapper { /// <summary> /// /// </summary> /// <param name="sourceType"></param> /// <param name="targetType"></param> /// <returns></returns> public static IList<PropertyMapper> GetMapperProperties(Type sourceType, Type targetType) { var sourceProperties = sourceType.GetProperties(); var targetProperties = targetType.GetProperties(); return (from s in sourceProperties from t in targetProperties where s.Name == t.Name && s.CanRead && t.CanWrite && s.PropertyType == t.PropertyType select new PropertyMapper { SourceProperty = s, TargetProperty = t }).ToList(); } /// <summary> /// /// </summary> /// <param name="source"></param> /// <param name="target"></param> public static void CopyProperties(object source, object target) { var sourceType = source.GetType(); var targetType = target.GetType(); var mapperProperties = GetMapperProperties(sourceType, targetType); for (int index = 0,count=mapperProperties.Count; index < count; index++) { var property = mapperProperties[index]; var sourceValue = property.SourceProperty.GetValue(source, null); property.TargetProperty.SetValue(target, sourceValue, null); } } }