2016-05-25 1 views
0

Нельзя использовать Mapping Inheritance и TypeConverter вместе.Automapper - устройство наследования не работает с преобразователем типа

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

/* 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, все работает отлично.

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

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

ответ

2

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

Однако вы можете использовать ConstructUsing для создания исходного целевого объекта. Или пользовательский AfterMap, который также унаследован. Просто не конвертируем.

+0

Спасибо за ваш ответ! – arosgab

Смежные вопросы