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))
似乎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"。