AutoMapper:如何在展平时使用字符串参数映射MapFrom

时间:2015-10-04 15:25:28

标签: c# .net automapper

AutoMapper的MapFrom方法有两个重载:

.MapFrom(Expression<Func<object, object>>

.MapFrom<TMember>(string)

第一个重载可以像这样使用:

.ForMember(dest => dest.Date, opt => opt.MapFrom(order => order.Customer.DateOfBirth))

我尝试了第二次重载:

.ForMember(dest => dest.Date, opt => opt.MapFrom<DateTime>("Order.Customer.DateOfBirth"))

但是当使用关联的属性时它不起作用。谁知道在使用展平时如何使用第二次过载?

我问这个是因为我想办法动态地进行映射;例如:

.ForMember(dest => dest.Date, opt => opt.MapFrom<DateTime>(givenPropertyString))

提前致谢。

2 个答案:

答案 0 :(得分:3)

似乎MapFrom重载.MapFrom<TMember>(string)与嵌套属性不兼容(我可能在这里错了)。但是,对于您的问题,您可以创建自定义方法以使用反射获取嵌套的子属性值。并使用它与string NestedPropertyName动态映射任何属性值。

这是自定义方法(方法来源here

public static object GetNestedPropertyValue(object obj, string nestedDottedPropertyName)
{
    foreach (String part in nestedDottedPropertyName.Split('.'))
    {
        if (obj == null)
            return null;

        PropertyInfo info = obj.GetType().GetProperty(part);
        if (info == null)
            return null;

        obj = info.GetValue(obj, null);
    }
    return obj;
}

你可以在MapFrom中动态地(对于任何属性)使用此方法,例如

.ForMember(dest => dest.Date, 
            opt => opt.MapFrom(src => GetNestedPropertyValue(src, "Order.Customer.DateOfBirth")));

答案 1 :(得分:2)

使用Automapper动态映射类型有几种选择。

首先,如果源类型在编译时未知,则应使用Automapper DynamicMap。它允许仅指定目标类型:

var message = Mapper.DynamicMap<ICreateOrderMessage>(order);

关于你提出的关于MapFrom(string) - it works exaclty的提问:

Mapper.CreateMap<UserModel, UserDto>()
    .ForMember(dto => dto.FullName, opt => opt.MapFrom<string>("FirstName"));

可能是嵌套的属性,例如你的&#34; Order.Customer.DateOfBirth&#34;只是不受支持。