自动映射:忽略完全匹配并改为使用后缀匹配

时间:2010-11-02 22:27:35

标签: automapper

我正在努力研究如何从Foo填充FooConfig

class Bar
{
   int A;
   int B;
}

class Foo
{
   Bar BarValues;
   Bar BarErrorValues;
}

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

FooConfig基本上是Foo的扁平版本。

我可以使用AutoMapper轻松填充BarValues(通过为FooConfig定义到Bar的地图),但我无法填充BarErrorValues - 所有内容我最后尝试使用AB值,而不是AErrorBError值。

我怀疑我需要使用“变形金刚”或RecognizePostfixes(虽然这似乎不起作用,因为我尝试过)。

2 个答案:

答案 0 :(得分: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}));

答案 1 :(得分:0)

我想我发现了这个问题。看来如果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;