Automapper使用派生类型属性展平

时间:2013-05-08 11:08:40

标签: flatten automapper-2

我正在使用自动播放器来展平来自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
}

使用automapper我试图将其扁平化为:

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

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

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

建议表示赞赏。

1 个答案:

答案 0 :(得分:1)

评分映射到 ProductRate 非常简单,只需“ForMember”

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

您可以做的另一件事就是将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