开发者

How to specify a specific type converter for a given property using AutoMapper

开发者 https://www.devze.com 2023-01-20 02:01 出处:网络
How can I override the type converter being used by AutoMapper for a given property? For example, if I have:

How can I override the type converter being used by AutoMapper for a given property?

For example, if I have:

public class Foo
{
    public string Name { get; set; }
}

public class Bar
{
    public string Name { get; set; }
}

Now I simply want to map Foo.Name to Bar.Name but using a specified type converter. I see how I can do it using:

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

But this hard-codes the conversion to use the Name property on Foo. If I have the same type of conversion on other properties i开发者_开发百科n this or other classes, I have to create a resolver class for each.

And I don't want to specify a converter for string -> string as this conversion is specific to this property or others like it.

I just want to override the type converter! I'm sure this must be possible but I'm blanking on it :-(

I'm after something like this:

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


I discovered the answer reading through the unit tests for AutoMapper. It's not very obvious, despite the fluent interface, because many of the methods on the mapping options return void. However, ResolveUsing<>() doesn't return void but allows you to specify further options. Herein lies the solution:

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

I'd prefer not to have to specify the .FromMember when the property is the default which AutoMapper would use anyway and all I want to use is override the type converter/resolver.

0

精彩评论

暂无评论...
验证码 换一张
取 消