我正在尝试使用AutoMapper将具有嵌套复杂类型的实体压平为平面dto。
在大多数情况下,这可以正常工作。但是,如果dto中的属性名称与类名称之一相同,则AutoMapper将抛出错误,指出无法映射该属性。
在下面的示例中,Dto中的NestedComplexType属性具有与NestedComplexType类相同的名称。
public class Entity
{
public int Id { get; protected set; }
public NestedComplexType NestedComplexType { get; protected set; }
}
public class NestedComplexType
{
public decimal Property { get; private set; }
}
public class Dto
{
public decimal NestedComplexType { get; protected set; }
}
public static class AutoMapperConfiguration
{
public static IMapper Configure()
{
var config = new MapperConfiguration(cfg =>
{
cfg.AddProfile<CustomProfile>();
});
config.AssertConfigurationIsValid();
return config.CreateMapper();
}
}
internal class CustomProfile : Profile
{
public CustomProfile()
{
// Want to make complex type use the custom mapping NestedComplexType -> Dto, rather than the default mapping
CreateMap<Entity, Dto>()
.IncludeMembers(x => x.NestedComplexType);
CreateMap<NestedComplexType, Dto>(MemberList.None)
.ForMember(m => m.NestedComplexType, o => o.MapFrom(x => x.Property));
}
}
void Main()
{
var mapper = AutoMapperConfiguration.Configure();
}
这会导致错误,提示无法映射NestedComplexType,添加自定义映射表达式等。
我可以通过映射来自ComplexType的所有内容来解决此问题,例如
public CustomProfile()
{
// Workaround
CreateMap<Entity, Dto>()
.ForMember(m => m.NestedComplexType, o => o.MapFrom((s, d) => s.NestedComplexType?.Property));
}
理想情况下,我希望能够显式地告诉Entity-> Dto映射使用NestedComplexType-> Dto的自定义映射,而不是使用基于默认名称的约定。有办法吗?