1

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 でインライン マッピングを使用すると、すべて正常に機能します。

それは私が見逃しているものですか?

PD。私が使用している: AutoMapper: version="4.2.1", targetFramework="net452"

4

1 に答える 1

4

いいえ、ConvertUsing と他のものを組み合わせることはできません。カスタム型コンバーターを使用すると、マッピングは完全にあなた次第になります。そのため、「ConvertUsing」は「void」を返します。これは、「構成が完了しました」という合図です。

ただし、ConstructUsing を使用して最初の宛先オブジェクトを構築することはできます。または、これも継承されるカスタム AfterMap です。ConvertUsingではありません。

于 2016-05-26T02:47:42.563 に答える