2017-05-25 41 views
0

我需要將一個對象的屬性複製到另一個對象,兩個對象可以是不同的類型,可以具有相同名稱的屬性。這些屬性也可以是複雜的類型。複製選擇屬性到其他類型的對象

我是能夠實現簡單TYPE性質,我怎麼過的,我無法實現這一複雜類型的複製功能..像見下面的示例代碼段

[TestClass] 
public class PropAssignTest 
{ 
    [TestMethod] 
    public void Test() 
    { 
     Test1 t1 = new Test1() { Prop1 = "test", TestName = new Test3 { Name = "santosh" } } ; 
     Test2 t2 = new Test2(); 
     Assign<Test1, Test2>(t1, t2, e => e.Prop1); 
     Assign<Test1, Test2>(t1, t2, e => e.TestName.Name);//this doesnot work !! 
    } 

    private void Assign<T1,T2>(T1 T1Obj, T2 T2Obj, Expression<Func<T1, object>> memberLamda) 
    { 
     var memberSelectorExpression = memberLamda.Body as MemberExpression; 
     if (memberSelectorExpression != null) 
     { 
      var property = memberSelectorExpression.Member as PropertyInfo; 
      if (property != null) 
      { 
       T2Obj.GetType().GetProperty(property.Name).SetValue(T2Obj, property.GetValue(T1Obj)); 
      } 
     } 
    } 

在上面的代碼中,我想複製e.TestName.Name ,其中TestName是一個複雜類型的對象,其中我只需要複製TestName,TestName的Name屬性就可以定義許多屬性。

任何建議...

感謝

+1

只需使用AutoMapper :) –

+0

不,我不能,我One.Because只想複製選定的屬性,Automapper會嘗試複製所有屬性。 –

+1

@SantoshVaza你可以配置AutoMapper如何將T1映射到T2 –

回答

4

使用AutoMapper,而忽略你不希望映射的成員。

config.CreateMap<Person, Employee>() 
    .ForMember(d => d.Name, o => o.MapFrom(s => s.FullName)) 
    .ForMember(d => d.Age, o => o.Ignore()); 
+0

謝謝@Kevin,但是我不想使用automapper –

0

您可以嘗試使用@Kevin提到的AutoMapper。如果你仍然需要一個自定義的方法,你可以試試這個。注意:它將值複製到目標對象本身的屬性中,並且不像表達式樹中那樣查找屬性。

private static void Assign<T1, T2>(T1 T1Obj, T2 T2Obj, Expression<Func<T1, object>> memberLamda) 
{ 
    var memberSelectorExpression = memberLamda.Body as MemberExpression; 

    if (memberSelectorExpression != null) 
    { 
     var sourceProperty = memberSelectorExpression.Member as PropertyInfo; 

     if (sourceProperty != null) 
     { 
      var targetProperty = T2Obj.GetType().GetProperty(sourceProperty.Name); 

      if (targetProperty != null) 
      { 
       targetProperty.SetValue(T2Obj, GetValue(T1Obj, memberSelectorExpression)); 
      } 
     } 
    } 
} 

public static object GetValue<T>(T source, MemberExpression expr) 
{ 
    var sourceProperty = expr.Member as PropertyInfo; 

    var nextExpression = expr.Expression as MemberExpression; 

    if (nextExpression == null) 
    { 
     return sourceProperty.GetValue(source); 
    } 

    var sourcePart = GetValue(source, nextExpression); 
    return sourceProperty.GetValue(sourcePart); 
} 
+0

感謝您的回答,請嘗試。 targetProperty == null檢查似乎是一個小故障,如果T2Obj已經有一個同名的屬性 –

相關問題