代码之家  ›  专栏  ›  技术社区  ›  Jack Ukleja

Automapper:忽略精确匹配,改为使用后缀匹配

  •  2
  • Jack Ukleja  · 技术社区  · 14 年前

    Foo FooConfig

    class Bar
    {
       int A;
       int B;
    }
    
    class Foo
    {
       Bar BarValues;
       Bar BarErrorValues;
    }
    
    class FooConfig
    {
       int A;
       int B;
       int AError;
       int BError;
    }
    

    食物配置 基本上是 .

    我可以填充 BarValues 使用AutoMapper很容易(通过为 食物配置 Bar ),但我很难得到 BarErrorValues 填充-我尝试的所有结果 A B 其中的值而不是 AError BError 价值观。

    我想我需要一个“变压器”或者 RecognizePostfixes (尽管这似乎不像我试过的那样管用)。

    2 回复  |  直到 14 年前
        1
  •  1
  •   PatrickSteele    14 年前

    这应该“开箱即用”:

    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}));
    
        2
  •  0
  •   Jack Ukleja    14 年前

    我想我找到了问题所在。似乎,如果AutoMapper找到一个完全匹配的名称,那么就永远不会使用名称转换器。Bugger:(这是显示它的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;