2017-04-26 84 views
1

這個標題很混亂。用代碼顯示會更容易一些。這裏有後臺類:Automapper - 創建自定義屬性映射,其中源對象未知並且屬性名稱不匹配?

public interface ISearch { } 

public class Search1 : ISearch 
{ 
    public string PROP1 { get; set; } 
} 

public class Search2 : ISearch 
{ 
    public string PROP2 { get; set; } 
} 

public class SearchFinal 
{ 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
} 

這就是我想要做的事:

public class SomeClass 
{ 
    IMapper mapper; 

    public SomeClass() 
    { 
     //This config fails validation 
     var config = new MapperConfiguration(cfg => { 
      cfg.CreateMap<ISearch, SearchFinal>() 
       .ForMember(dest => dest.Prop1, opts => opts.MapFrom("PROP1")) 
       .ForMember(dest => dest.Prop2, opts => opts.MapFrom("PROP2")); 
     }); 
     mapper = new Mapper(config); 
    } 

    public void SearchMethod(ISearch search) 
    { 
     SearchFinal test = mapper.Map<SearchFinal>(search); 

     // Do query stuff 
    } 
} 

的配置在運行時驗證失敗,因爲「PROP1」 /「PROP2」性質唐在界面中不存在。有沒有辦法設置這張地圖?圍繞這個問題的任何其他方式,而不重組這個承認醜陋的代碼結構?

回答

1

只需爲每個接口實現創建地圖(因此也將使用映射僅適用於存在於每一類的屬性 - 即沒有試圖映射Prop2Search1類):

var config = new MapperConfiguration(cfg => { 
    cfg.CreateMap<Search1, SearchFinal>() 
     .ForMember(dest => dest.Prop1, opts => opts.MapFrom(src => src.PROP1)); 

    cfg.CreateMap<Search2, SearchFinal>() 
     .ForMember(dest => dest.Prop2, opts => opts.MapFrom(src => src.PROP2)); 
}); 

接下來通過一些實施ISearch接口,其被映射到SearchFinal

ISearch search = new Search1 { PROP1 = "foo" }; 
// note that you are mapping variable of ISearch type here 
SearchFinal test = mapper.Map<SearchFinal>(search); 

輸出:

{ 
    "Prop1": "foo", 
    "Prop2": null 
} 
+1

Awsome,謝謝!我喜歡簡單的答案。我不知道爲什麼我不認爲我可以將ISearch傳遞到映射方法,如果它沒有在配置中定義! – Andrew