我想从像这样的代码中推广属性查找
.ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.GetValue("FirstName"))
.ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.GetValue("LastName"))
... (repeated for many properties)
到一个单行,概念上是这样的:
// How can I access the property name?
.ForAllMembers(opt => opt.MapFrom(src => src.GetValue([[PROPERTYNAME]]))
“source”值几乎总是使用目标中的属性名称对GetValue()方法进行基于字符串的查找。我只是不知道如何在“source”lambda中定义属性的字符串名称,当它在“destination”lambda中定义时。似乎应该有办法做到这一点,但我找不到相关的例子。
我希望这是有道理的。提前感谢任何见解,
杰夫
答案 0 :(得分:1)
您应该能够使用使用反射的Custom Resolver来获取所有属性名称,然后调用源对象的GetValue()方法。
答案 1 :(得分:1)
我知道这个问题就像2 - 3年一样,但我遇到了类似的问题并且很难找到答案,主要是因为文档中没有记录IValueResolver接口。
我最终做了这样的事情:
public class UserProfileMapping : Profile
{
protected override void Configure()
{
Mapper.CreateMap<ProfileBase, UserProfileModel>()
.ForAllMembers(m => m.ResolveUsing<ProfileValueResolver>());
}
public class ProfileValueResolver : IValueResolver
{
public ResolutionResult Resolve(ResolutionResult source)
{
return source.New(
((ProfileBase)source.Value)
.GetPropertyValue(source.Context.MemberName)
);
}
}
}
希望这有助于某人。