2010-11-02 99 views
2

我試圖找出如何從FooConfig填充FooAutomapper:忽略精確匹配和使用後綴匹配,而不是

class Bar 
{ 
    int A; 
    int B; 
} 

class Foo 
{ 
    Bar BarValues; 
    Bar BarErrorValues; 
} 

class FooConfig 
{ 
    int A; 
    int B; 
    int AError; 
    int BError; 
} 

FooConfig本質上是Foo扁平版本。

我可以(通過具有FooConfigBar定義地圖)填充容易與AutoMapper的BarValues,但我遇到麻煩BarErrorValues填充 - 一切,我嘗試在它結束了與AB值,而不是AErrorBError值。

我懷疑我需要使用「變壓器」或RecognizePostfixes(雖然這似乎並不像我試過的那樣)。

回答

0

我想我已經找到了問題。看起來,如果AutoMapper發現完全匹配,那麼名稱變換器從不使用。開溜:(這裏是AutoMapper源代碼顯示它:

private static MemberInfo FindTypeMember(IEnumerable<MemberInfo> modelProperties, IEnumerable<MethodInfo> getMethods, string nameToSearch, IMappingOptions mappingOptions) 
{ 
    MemberInfo pi = modelProperties.FirstOrDefault(prop => NameMatches(prop.Name, nameToSearch)); 
    if (pi != null) 
     return pi; 

    ... 

    pi = modelProperties.FirstOrDefault(prop => NameMatches(mappingOptions.SourceMemberNameTransformer(prop.Name), nameToSearch)); 
    if (pi != null) 
     return pi; 
1

這應該工作「開箱即用」。

Mapper.CreateMap<FooConfig, Foo>() 
    .ForMember(d => d.BarValues, o => o.MapFrom(s => new Bar { A = s.A, B = s.B })) 
    .ForMember(d => d.BarErrorValues, o => o.MapFrom(s => new Bar {A = s.AError, B = s.BError})); 
+0

嗨帕特里克我試圖避免每個成員寫ForMember(我實際上有50多個),如果我要這樣做,那麼我可能會寫一個手動X = Y函數 – Schneider 2010-11-03 02:34:48