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))
提前致谢。
答案 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;只是不受支持。