2011-06-20 6 views
5

Với các lớp học sau:Automapper: Giải quyết nguồn tên thuộc tính từ automapped đối tượng

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;} 
} 

Và cấu hình bản đồ sau:

Mapper.CreateMap<User, UserDto>() 
      .ForMember(destination => destination.FirstName, 
      options => options.MapFrom(source => source.Name.FirstName)) 

Có thể giải quyết tên của thuộc tính nguồn cho một đã cho thuộc tính trên đối tượng đích:

giống như sau:

Assert.AreEqual(GetSourcePropertyName<User, UserDto>("FirstName"), "Name.FirstName") 

Trả lời

7

Vì MapFrom() lấy một lambda, có thể thuộc tính đích được ánh xạ tới bất kỳ thứ gì. Bạn có thể sử dụng bất kỳ lambda nào bạn muốn. Hãy xem xét điều này:

.ForMember(
    destination => destination.FullName, 
    options => options.MapFrom(source => source.Name.FirstName + " " + source.Name.LastName) 
); 

Bởi vì bạn không bị buộc phải tạo đơn giản accessor lambdas, bạn không thể giảm biểu thức nguồn thành chuỗi tên thuộc tính đơn giản.

Nếu MapFrom() lấy Expression<Func<TSource, TMember>>, bạn có thể biến biểu thức thành chuỗi nhưng không thể thực hiện theo cách hiện tại được viết.