如何覆盖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>() );
答案 0 :(得分:8)
我通过AutoMapper的单元测试发现了答案。尽管界面流畅,但它并不是很明显,因为映射选项上的许多方法都返回void。但是,ResolveUsing<>()
不会返回void,但允许您指定其他选项。这就是解决方案:
Mapper
.CreateMap<Source,Dest>
.ForMember( dest => dest.Name,
opt => opt.ResolveUsing<MySpecialStringConverter>()
.FromMember( source => source.Name ) );
当属性是AutoMapper将使用的默认值时,我宁愿不必指定.FromMember
,而我想要使用的只是覆盖类型转换器/解析器。