自动映射:从自动对象中解析源属性名称

Pau*_*aul 5 .net c# automapper

鉴于以下课程:

public class User
{
  public int Id {get;set;}
  public PersonName Name {get;set;}
}

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


public class UserDto 
{
  public int Id {get;set;}
  public string FirstName {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

以及映射配置如下:

 Mapper.CreateMap<User, UserDto>()
            .ForMember(destination => destination.FirstName, 
            options => options.MapFrom(source => source.Name.FirstName))
Run Code Online (Sandbox Code Playgroud)

是否可以解析目标对象上给定属性的源属性的名称:

就像是:

Assert.AreEqual(GetSourcePropertyName<User, UserDto>("FirstName"), "Name.FirstName")
Run Code Online (Sandbox Code Playgroud)

Pat*_*sey 7

因为MapFrom()采用lambda,所以目标属性可能映射到任何东西.你可以使用你想要的任何lambda.考虑一下:

.ForMember(
    destination => destination.FullName,  
    options => options.MapFrom(source => source.Name.FirstName + " " + source.Name.LastName)
);
Run Code Online (Sandbox Code Playgroud)

因为您不必强制创建简单的属性访问器lambdas,所以不能将源表达式简化为简单的属性名称字符串.

如果MapFrom()采用Expression<Func<TSource, TMember>>它可以将表达式转换为字符串,但它不能按照当前编写的方式完成.