带有ValueFormatter的AutoMapper

Jan*_*kan 5 c# automapper automapper-2

我正在学习如何使用AutoMapper,我在使用ValueFormatter时遇到了问题.

这是Console中的简单示例,我无法将其与NameFormatter一起使用:

class Program
{
    static void Main(string[] args)
    {
        Mapper.Initialize(x => x.AddProfile<ExampleProfile>());

        var person = new Person {FirstName = "John", LastName = "Smith"};

        PersonView oV = Mapper.Map<Person, PersonView>(person);

        Console.WriteLine(oV.Name);

        Console.ReadLine();
    }
}

public class ExampleProfile : Profile
{
    protected override void Configure()
    {
        //works:
        //CreateMap<Person, PersonView>()
        //    .ForMember(personView => personView.Name, ex => ex.MapFrom(
        //        person => person.FirstName + " " + person.LastName));

        //doesn't work:
        CreateMap<Person, PersonView>()
            .ForMember(personView => personView.Name, 
             person => person.AddFormatter<NameFormatter>());
    }
}

public class NameFormatter : ValueFormatter<Person>
{
    protected override string FormatValueCore(Person value)
    {
        return value.FirstName + " " + value.LastName;
    }
}

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class PersonView
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?AutoMapper是2.2.1版

Lef*_*tyX 4

您应该使用(此处ValueResolver有更多信息):

public class PersonNameResolver : ValueResolver<Person, string>
{
    protected override string ResolveCore(Person value)
    {
        return (value == null ? string.Empty : value.FirstName + " " + value.LastName);
    }
}
Run Code Online (Sandbox Code Playgroud)

你的个人资料应该是这样的:

public class ExampleProfile : Profile
{
    protected override void Configure()
    {
        CreateMap<Person, PersonView>()
            .ForMember(personView => personView.Name, person => person.ResolveUsing<PersonNameResolver>());
    }
}
Run Code Online (Sandbox Code Playgroud)

据作者介绍,Formatters用于全局类型转换。您可以在这里这里阅读他的一些回复。

我会选择你的第一个选择:

 CreateMap<Person, PersonView>()
      .ForMember(personView => personView.Name, ex => ex.MapFrom(
           person => person.FirstName + " " + person.LastName));
Run Code Online (Sandbox Code Playgroud)

显然值格式化程序是一个错误