2015-10-04 71 views
2

當與字符串參數MapFrom AutoMapper的MapFrom方法有兩個重載:AutoMapper:如何壓扁

.MapFrom(Expression<Func<object, object>> 

.MapFrom<TMember>(string) 

第一過載,可以使用這樣的:

.ForMember(dest => dest.Date, opt => opt.MapFrom(order => order.Customer.DateOfBirth)) 

我試過這樣的第二次過載:

.ForMember(dest => dest.Date, opt => opt.MapFrom<DateTime>("Order.Customer.DateOfBirth")) 

但是,當使用關聯的屬性時它不起作用。誰不知道在使用扁平化時如何使用第二個重載?

我問這是因爲我尋找一種方法來動態地進行映射;例如:

.ForMember(dest => dest.Date, opt => opt.MapFrom<DateTime>(givenPropertyString)) 

在此先感謝。

回答

3

似乎MapFrom過載.MapFrom<TMember>(string)不適合嵌套屬性(我可能在這裏是錯誤的)。但是,對於您的問題,您可以創建一個自定義方法,以使用反射來獲取嵌套的子屬性值。並用它來動態地映射任何屬性值string NestedPropertyName

這是自定義的方法(方法的來源here

public static object GetNestedPropertyValue(object obj, string nestedDottedPropertyName) 
{ 
    foreach (String part in nestedDottedPropertyName.Split('.')) 
    { 
     if (obj == null) 
      return null; 

     PropertyInfo info = obj.GetType().GetProperty(part); 
     if (info == null) 
      return null; 

     obj = info.GetValue(obj, null); 
    } 
    return obj; 
} 

而且你可以在MapFrom動態地使用這種方法(任何屬性),這樣

.ForMember(dest => dest.Date, 
      opt => opt.MapFrom(src => GetNestedPropertyValue(src, "Order.Customer.DateOfBirth"))); 
+0

你說得對,它不適用於嵌套屬性。在我看到你的答案之前,我剛剛改變了我的問題。 –

+0

@JorritSteetskamp仍然這個答案應該是相關:) –

+1

確實,作品像一個魅力! –

2

有幾種選擇使用Automapper動態地映射類型。

首先,Automapper DynamicMap應該在編譯時未知源類型的情況下使用。它允許只指定目標類型:

var message = Mapper.DynamicMap<ICreateOrderMessage>(order); 

而關於你的問題有關MapFrom(string) - it works exaclty你的建議:

Mapper.CreateMap<UserModel, UserDto>() 
    .ForMember(dto => dto.FullName, opt => opt.MapFrom<string>("FirstName")); 

喜歡你「Order.Customer.DateOfBirth」也許嵌套屬性只是不支持的。