【问题标题】:Automapper flatten with derived type propertiesAutomapper 使用派生类型属性展平
【发布时间】:2013-05-08 11:08:39
【问题描述】:

我正在使用自动映射器来展平来自 WS 的对象。简化模型如下:

public abstract class AOrder {
    public Product Product {get;set;}
    public decimal Amount {get;set;}
    //number of other properties
}

public abstract class Product {
    //product properties
}
public class RatedProduct : Product {
   public int Rate { get;set;}
}

public class MarketOrder : AOrder {
    //some specific market order properties
}

使用自动映射器,我试图将其展平为:

public class OrderEntity {
   public decimal Amount {get;set;}
   public int ProductRate {get;set;}
}

下一个映射:

CreateMap<RatedProduct, OrderEntity>();
CreateMap<MarketOrder, OrderEntity>();

上述映射不会映射 ProductRate。 Atm 我刚刚使用了 AfterMap:

CreateMap<MarketOrder, OrderEntity>()
    .AfterMap((s,d) => {
         var prod = s.Product as RatedProduct;
         if (prod != null) 
         {
             //map fields
         }
     });

效果很好,但我想如果我可以重用自动映射器展平的可能性(即按名称匹配),我就不需要在很多地方应用 after map。

注意:我无法更改 WS,这只是对象层次结构的一小部分。

建议表示赞赏。

【问题讨论】:

  • 这不是“多态性”,因为多态属性意味着该基类型定义了一个方法或属性,并且子类实现了它....并且当您在基类上调用方法/属性时参考实际使用的具体类型。在您的情况下,基类没有该属性...并且您需要进行向下转换。向下转换也是如此,因为没有多态性。
  • @jsobo,我还需要将所有属性从abstract Product 映射到RatedProduct。有人可能会坚持正确使用子类型多态性,因此我按照您的说明更改了标题。

标签: flatten automapper-2


【解决方案1】:

使用“ForMember”将 Rate 映射到 ProductRate 相当简单

您必须对特定类型进行强制转换以查看它是否是该类型有点棘手,但我认为您采取的相同方法可能是您必须做的,但我认为您不需要做“后图”。我认为必须找到您所有的目标映射,或者您需要将它们标记为忽略映射将失败。

您可以做的另一件事就是将 OrderEntity.ProductRate 更改为 OrderEntity.Rate。然后它会找到它并为您映射它,除了它被隐藏的地方,因为 Product 没有费率(但 RatedProducts 有)。

public class OrderEntity {
   public decimal Amount {get;set;}
   public int Rate {get;set;}  //changed name from ProductRate to just Rate.
}

 Mapper.CreateMap<Product, OrderEntity>()
    .Include<RatedProduct, OrderEntry>();

 Mapper.CreateMap<RatedProduct, OrderEntry>();

查看:Polymorphic element types in collections

【讨论】:

  • 抱歉,我错过了新版本的自动映射器。我不是 100% 确定这现在有效吗?
  • 此解决方案与我使用 AfterMap 方法的解决方案相同。
  • @Aleksey 同意,但是请参阅:github.com/AutoMapper/AutoMapper/wiki/Lists-and-arrays 我认为您想设置一个子父映射,请参阅标记为“集合中的多态元素类型”的部分,这将允许您将事物映射到“产品”但如果它真的是“RatedProduct”,请指定如何以不同方式映射它。
  • 在这种情况下使用 AfterMap 可能更容易,因为如果 Product 是 RatedProduct 类型,至少我可以抽象将 N 个属性从 RatedProduct 映射到 OrderEntry 的功能。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多