如何使用AutoMapper为给定属性指定特定类型转换器

时间:2010-10-13 23:36:52

标签: automapper typeconverter

如何覆盖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>() );

但是这会将转换硬编码为在Foo上使用Name属性。如果我对这个或其他类中的其他属性有相同类型的转换,我必须为每个属性创建一个解析器类。

而且我不想为字符串指定转换器 - &gt;字符串,因为此转换特定于此属性或其他类似属性。

我只想覆盖类型转换器!我确信这一定是可能的,但我却在说: - (

我是这样的:

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

1 个答案:

答案 0 :(得分:8)

我通过AutoMapper的单元测试发现了答案。尽管界面流畅,但它并不是很明显,因为映射选项上的许多方法都返回void。但是,ResolveUsing<>()不会返回void,但允许您指定其他选项。这就是解决方案:

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

当属性是AutoMapper将使用的默认值时,我宁愿不必指定.FromMember,而我想要使用的只是覆盖类型转换器/解析器。