-1

我正在使用自动映射器来展平来自 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,这只是对象层次结构的一小部分。

建议表示赞赏。

4

1 回答 1

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

参见:集合中的多态元素类型

于 2013-05-08T12:06:49.150 回答