Как указать конкретный конвертер типа для данного свойства с помощью AutoMapper - PullRequest
6 голосов
/ 14 октября 2010

Как я могу переопределить конвертер типов, используемый AutoMapper для данного свойства?

Например, если у меня есть:

public class Foo
{
    public string Name { get; set; }
}

public class Bar
{
    public string Name { get; set; }
}

Теперь я просто хочу сопоставить Foo.Name с Bar.Name, но с использованием указанного конвертера типов. Я вижу, как я могу сделать это, используя:

Mapper
    .CreateMap<Foo,Bar>()
    .ForMember( x => x.Name, opt => opt.ResolveUsing<FooNameResolver>() );

Но это жестко закодирует преобразование для использования свойства Name в Foo. Если у меня есть такой же тип преобразования для других свойств в этом или других классах, я должен создать класс резолвера для каждого.

И я не хочу указывать конвертер для строки -> строка, поскольку это преобразование относится только к этому свойству или другим подобным.

Я просто хочу переопределить преобразователь типов! Я уверен, что это возможно, но я не обращаю на это внимания: - (

Я за чем-то вроде этого:

Mapper
    .CreateMap<Foo,Bar>()
    .ForMember( x => x.Name, opt => opt.Using<MySpecialStringConverter>() );

1 Ответ

8 голосов
/ 14 октября 2010

Я обнаружил ответ, прочитав юнит-тесты для AutoMapper. Это не очень очевидно, несмотря на свободный интерфейс, потому что многие методы в параметрах отображения возвращают void. Однако ResolveUsing<>() не возвращает void, но позволяет вам указать дополнительные параметры. В этом и заключается решение:

Mapper
    .CreateMap<Source,Dest>
    .ForMember( dest => dest.Name, 
                opt => opt.ResolveUsing<MySpecialStringConverter>()
                          .FromMember( source => source.Name ) );

Я бы предпочел не указывать .FromMember, когда свойство является значением по умолчанию, которое AutoMapper будет использовать в любом случае, и все, что я хочу использовать, это переопределить преобразователь / преобразователь типов.

...