我想通过循环遍历所有映射属性来重用 c# Automapper 的初始化映射(使用版本 6.2.2)。
假设我有以下内容:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class PersonDto
{
public int Id { get; set; }
public string FullName { get; set; }
}
AutoMapper.Mapper.Initialize(cfg =>
{
cfg.CreateMap<Person, PersonDto>()
.ForMember(dest => dest.FullName,
opt => opt.MapFrom(src => src.FirstName + " " + src.LastName));
};
for 循环的Id行为符合预期:
var map = AutoMapper.Mapper.Configuration.FindTypeMapFor<Person, PersonDto>();
foreach (var propertyMap in map.GetPropertyMaps())
{
var destProp = propertyMap.DestinationProperty.Name; // = "Id"
var sourceMember = propertyMap.SourceMember.Name; // = "Id"
var sourceMembers = propertyMap.SourceMembers; // Count = 1
}
但是当我遍历FullName属性映射时,我想实现 propertyMap.SourceMembers 导致两个 SourceMembersFirstName和LastName:
var map = AutoMapper.Mapper.Configuration.FindTypeMapFor<Person, PersonDto>();
foreach (var propertyMap in map.GetPropertyMaps())
{
var destProp = propertyMap.DestinationProperty.Name; // = "FullName"
var sourceMember = propertyMap.SourceMember.Name; // = "LastName" (I don't care)
var sourceMembers = propertyMap.SourceMembers; // Count = 0 (want to achieve 2 for FirstName and LastName)
}
orderBy我的目标是为基于初始化的自动映射器映射的功能创建一个自动化的类似映射。所以我需要知道(a)订单和(b)sourceMembers。在上述情况下,我想FullName从其源成员FirstName和LastName(按此顺序)获取映射。
是否有可能正确注册多个源成员,以便propertyMap.SourceMembers产生所有映射的源成员?如果是,地图初始化应该是什么样子?
PS:我不想手动编写 orderBy 映射,因为我已经有了 automapper 的映射。