AutoMapper:如何在扁平化时使用字符串参数进行映射

本文关键字:字符串 参数 映射 扁平化 AutoMapper | 更新日期: 2023-09-27 18:16:08

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))

AutoMapper:如何在扁平化时使用字符串参数进行映射

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

这是自定义方法(这里是方法的来源)

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")));

可以使用Automapper动态映射类型。

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

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

关于你关于MapFrom(string)的问题-它完全按照你的建议工作:

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

可能是嵌套的属性,比如"Order.Customer。"不支持DateOfBirth"。