Automapper - сопоставитель наследования не работает с преобразователем типов

Невозможно использовать Mapping Inheritance и TypeConverter вместе.

У меня есть этот код:

/* BaseClassTypeConverter.cs */
public class BaseClassTypeConverter : ITypeConverter<SourceClass, BaseClass> {
    public BaseClass Convert(ResolutionContext context) {
        if (context == null || context.IsSourceValueNull)
            return null;

        var src = (SourceClass)context.SourceValue;

        return new BaseClass() {
            CommonAttr = src.SourceAttr
        };
    }
}

/* AutoMapperConfig.cs */
public static class AutoMapperConfig {

    public static void RegisterMappings() {
        AutoMapper.Mapper.Initialize(config => {
            config
                .CreateMap<SourceClass, BaseClass>()
                .Include<SourceClass, DerivedClass1>()
                .Include<SourceClass, DerivedClass2>()  
                .ForMember(dest => dest.CommonAttr, o => o.MapFrom(src => src.SourceAttr));
                //.ConvertUsing<BaseClassTypeConverter>(); //  NOT WORKING

            config
                .CreateMap<SourceClass, DerivedClass1>()
                .ForMember(dest => dest.Dummy, o => o.MapFrom(src => src.SourceAttr2))
                .IncludeBase<SourceClass, BaseClass>();
        });
    }
}

Как видите, я хочу иметь возможность отображать из класса TypeConverter, потому что мне нужно выполнить более сложные вычисления, а не просто присвоить значения, как указано выше.

Когда я использую преобразователь типов, сопоставления не работают, однако, когда я удаляю ConvertUsing и использую встроенное сопоставление с ForMember, все работает нормально.

Это что-то, что мне не хватает?

ПД. Я использую: AutoMapper: version="4.2.1", targetFramework="net452"


person gabaros    schedule 25.05.2016    source источник


Ответы (1)


Нет, вы не можете комбинировать ConvertUsing и что-то еще. Как только вы используете пользовательский преобразователь типов, сопоставление полностью зависит от вас. Вот почему «ConvertUsing» возвращает «void», это сигнал о том, что «вы закончили с конфигурацией, спасибо».

Однако вы МОЖЕТЕ использовать ConstructUsing для построения начального целевого объекта. Или пользовательский AfterMap, который также унаследован. Только не ConvertUsing.

person Jimmy Bogard    schedule 26.05.2016
comment
Спасибо за Ваш ответ! - person gabaros; 26.05.2016