1

您好,我无法让我的映射适用于继承的类。想法是只为基对象和接口创建一次映射,当子类实现自己的成员时,只为那些未在基类或接口中定义的成员配置映射。

让我从示例代码开始。

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

附加代码当然可以工作。打电话时:

AutoMapper.Mapper.Map<ChildEntityClass, DtoClass>(instanceOfChildEntityClass);

我只得到定义在CreateMap<ChildEntityClass, DtoClass>().

知道如何只为基类和接口实现一次映射吗?是的,我想将所有类型的 ChildEntityClass、BaseEntityClass 和 IField3 映射到 DtoClass。

欢迎任何关于优雅配置的提示,例如映射。

编辑:为了清楚起见,我从子类中删除了不必要的 IncludeBase,但两者都没有
- 子类中的 IncludeBase - 包含在基类中对我有用。什么会导致这样的问题?

4

2 回答 2

1

你不应该使用.IncludeBaseAND .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>()
    ;
于 2016-10-31T15:59:04.300 回答
0

因为它经常发生的问题超出了我在示例代码中提供的范围。

在我的初始化方法项目中隐藏了类似的调用:

        foreach (string propName in map.GetUnmappedPropertyNames())
        {
            expr.ForMember(propName, opt => opt.Ignore());
        }

因此,即使在为基类型调用映射时,所有未在子类中映射的列也会被自动忽略。简单但有问题。

上面这样的代码可能是Mapper.Configuration.AssertConfigurationIsValid();为了通过而添加的。

于 2016-10-31T20:52:26.377 回答