Automapper: игнорировать точное соответствие и использовать вместо постфиксного соответствия - PullRequest
2 голосов
/ 03 ноября 2010

Я пытаюсь понять, как заполнить 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.

Я могу легко заполнить BarValues с помощью AutoMapper (имея карту, определенную для FooConfig до Bar), но у меня возникают проблемы с заполнением BarErrorValues - все, что я пытаюсь, заканчивается * В нем значения 1014 * и B вместо значений AError и BError.

Я подозреваю, что мне нужно использовать "трансформатор" или RecognizePostfixes (хотя, похоже, это не работает, как я пытался).

Ответы [ 2 ]

1 голос
/ 03 ноября 2010

Это должно работать "из коробки":

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 голосов
/ 03 ноября 2010

Я думаю, что нашел проблему. Похоже, что если 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...