如何根据目标属性名称在自动映射程序中执行字符串查找?

时间:2010-08-06 22:09:30

标签: c# lambda automapper

我想从像这样的代码中推广属性查找

.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中定义时。似乎应该有办法做到这一点,但我找不到相关的例子。

我希望这是有道理的。提前感谢任何见解,

杰夫

2 个答案:

答案 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)
            );
        }
    }
}

希望这有助于某人。