您好我无法让我的映射为继承的类工作。 想法是只为基础对象和接口创建一次映射,当子类实现自己的成员时,为那些未在基类或基础中定义的成员配置映射。
让我先从示例代码开始。
public class DtoClass {
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
}
public interface IField3 {
public string EntityField3 { get; set; }
}
public class BaseEntityClass {
public string EntityField1 { get; set; }
}
public class ChildEntityClass : BaseEntityClass, IField3 {
public string EntityField2 { get; set; }
public string EntityField3 { get; set; }
}
CreateMap<BaseEntityClass, DtoClass>()
.ForMember(c => c.Field1 , m => m.MapFrom(a => a.EntityField1))
.Include<ChildEntityClass, DtoClass>();
CreateMap<IField3, DtoClass>()
.ForMember(c => c.Field3 , m => m.MapFrom(a => a.EntityField3));
CreateMap<ChildEntityClass, DtoClass>()
.ForMember(c => c.Field2 , m => m.MapFrom(a => a.EntityField2));
附加代码dosnt工作的课程。在打电话时:
AutoMapper.Mapper.Map<ChildEntityClass, DtoClass>(instanceOfChildEntityClass);
我只获得CreateMap<ChildEntityClass, DtoClass>().
任何想法如何只为基类和接口实现一次映射? 是的,我想将所有类型ChildEntityClass,BaseEntityClass和IField3映射到DtoClass。
欢迎任何提示优雅配置此类映射。
编辑:为清楚起见,我从子类中移除了不受欢迎的IncludeBase,但两者都没有 - 子类中的IncludeBase - 包括在基类中 适合我。什么会导致这样的问题?
答案 0 :(得分:0)
你不应该使用.IncludeBase
AND .Include
- 选择一个并坚持使用它。我更喜欢.IncludeBase
,因为我认为在子类中定义更有意义。在您的情况下,您不能使用Include引用IField3,因为没有隐式转换。
以下代码对我使用IncludeBase
CreateMap<BaseEntityClass, DtoClass>()
.ForMember(dest => dest.Field1, opt => opt.MapFrom(src => src.EntityField1))
;
CreateMap<IField3, DtoClass>()
.ForMember(dest => dest.Field3, opt => opt.MapFrom(src => src.EntityField3))
;
CreateMap<ChildEntityClass, DtoClass>()
.ForMember(dest => dest.Field2, opt => opt.MapFrom(src => src.EntityField2))
.IncludeBase<BaseEntityClass, DtoClass>()
.IncludeBase<IField3, DtoClass>()
;
答案 1 :(得分:0)
由于经常发生问题超出了我在示例代码中提供的范围。
在我的初始化方法项目中隐藏了类似的调用:
foreach (string propName in map.GetUnmappedPropertyNames())
{
expr.ForMember(propName, opt => opt.Ignore());
}
因此,即使在调用基类型的映射时,也会自动忽略未在子类中映射的所有列。简单但有问题。
上面的代码可能是Mapper.Configuration.AssertConfigurationIsValid();
传递的。