2017-03-03 73 views
0

unflatten我有一個這樣的例子: Automapper由前綴

class Fields 
{ 
    string ContactOneName{get;set;} 
    string ContactOnePhone{get;set;} 
    string ContactOneSpouseName{get;set;} 
    string ContactOneSpousePhone{get;set;} 
} 

而且我想映射到這樣一個模型:

class Contacts 
{ 
    Contact ContactOne {get;set;} 
    Contact ContactOneSpouse {get;set;} 
} 

class Contact 
{ 
    string Name {get;set;} 
    string Phone {get;set;} 
} 

有許多領域和我不不想爲每個字段寫一個映射。 這可能嗎? 如果是這樣怎麼樣?

注意:這個問題幾乎是AutoMapper unflattening complex objects of same type的重複,但我想要一個解決方案而不是手動映射所有東西,因爲在這種情況下,它不值得使用automapper。

回答

0

您可以this,並添加:

public static IMappingExpression<TSource, TDestination> ForAllMembers<TSource, TDestination, TMember>(
    this IMappingExpression<TSource, TDestination> mapping, 
    Action<IMemberConfigurationExpression<TSource, TDestination, TMember>> opt) 
{ 
    var memberType = typeof(TMember); 
    var destinationType = typeof(TDestination); 

    foreach(var prop in destinationType.GetProperties().Where(prop => prop.PropertyType.Equals(memberType))) 
    { 
     var parameter = Expression.Parameter(destinationType); 
     var destinationMember = Expression.Lambda<Func<TDestination, TMember>>(Expression.Property(parameter, prop), parameter); 

     mapping.ForMember(destinationMember, opt); 
    } 

    return mapping; 
} 

然後,你可以配置映射如下:

var config = new MapperConfiguration(cfg => 
{ 
    cfg.CreateMap<Fields, Contacts>().ForAllMembers<Fields, Contacts, Contact>(x => { x.Unflatten(); }); 
});