2012-03-30 234 views
2

我正在尋找最簡單/最優雅的方式來使用源對象的擴展方法展平源對象。AutoMapper展開擴展方法

來源:

我想
class Source 
{ 
    public int Value1 { get; set; } 
    public int Value2 { get; set; } 
} 

擴展方法來映射優雅:

static class SourceExtensions 
{ 
    public static int GetTotal(this Source source) 
    { 
     return source.Value1 + source.Value2; 
    } 
} 

目的地:

class Destination 
{ 
    public int Value1 { get; set; } 
    public int Value2 { get; set; } 
    public int Total { get; set; } 
} 

是否有比這更好的方式(即一個我不必調用每個擴展方法)?

using NamespaceContainingMyExtensionMethods; 
... 
Mapper.CreateMap<Source, Destination>() 
    .ForMember(destination => destination.Total, 
     opt => opt.ResolveUsing(source => source.GetTotal())); 

喜歡的東西:

Mapper.CreateMap<Source, Destination>() 
    .ResolveUsingExtensionsInNamespace("NamespaceContainingMyExtensionMethods"); 

我知道我可以在源對象使用一個繼承層次結構,但在我的情況,這是不理想的。

我研究: Does AutoMapper's convention based mappings work with LINQ extension methods?https://github.com/AutoMapper/AutoMapper/issues/34

回答

1

新增承諾我的叉子,併爲這個拉請求。奇蹟般有效!

承諾:https://github.com/claycephus/AutoMapper/commit/e1aaf9421c63fb15daca02607d0fc3dff871fbd1

拉請求:https://github.com/AutoMapper/AutoMapper/pull/221

通過指定組件配置它來搜索:

Assembly[] extensionMethodSearch = new Assembly[] { Assembly.Load("Your.Assembly") }; 
Mapper.Initialize(config => config.SourceExtensionMethodSearch = extensionMethodSearch); 
Mapper.CreateMap<Source, Destination>(); 
+0

由於我們的項目實現這一點,我們偶然發現了好幾遍。我們現在要擺脫它。曾經聽過這樣的說法:「爲了自己的利益而太聰明」?這是其中的一種情況。 它傾向於產生一些偷偷摸摸的運行時錯誤,因爲AutoMapper非常像運行時間的野獸,而不是編譯時的事情。這個功能加劇了這個問題。但希望這有助於某個人有一天。 – Clay 2012-09-18 21:27:22