2013-05-08 69 views
-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。 大气压我只是用AfterMap:

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

它工作得很好,但想如果我可以重用automapper压扁的可能性(即通过名称匹配),我不需要地图中后应用相当多的地方。

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

建议感激。

+1

这不是“多态”为多形性将意味着该基地型具有已定义的方法或属性和孩子们实现它....当你调用方法/属性的基类引用实际使用了特定的类型。在你的情况下,基类没有财产......你需要做一个沮丧。因为没有多态性,所以它是向下转换的。 – 2013-05-08 12:32:39

+0

@jsobo,我需要将'abstract Product'中的所有属性映射到'RatedProduct'。有人可能会坚持正确使用亚型多态性,所以我按照你的说明改变了标题。 – 2013-05-08 13:36:05

回答

1

映射ProductRate是相当简单的用“ForMember”

的一个,你必须做一个强制转换为特定类型,看它是否是该类型是有点麻烦,但我认为你采取的方法是你可能必须做的,但我认为你不需要做“后映射”。我认为你所有的目的地映射都必须找到,或者你需要将它们标记为忽略映射将失败。

你可以做的另一件事就是更改OrderEntity.ProductRate为OrderEntity.Rate。然后它会找到它并为您映射它,除非它被隐藏,因为产品没有速率(但是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>(); 

SEE:Polymorphic element types in collections

+0

对不起,我错过了有一个新版本的自动映射器。我不是100%肯定现在这个工作吗? – 2013-05-08 12:29:21

+0

该解决方案与我用于AfterMap方法的解决方案相同。 – 2013-05-08 13:24:20

+0

@Aleksey同意,但请参阅:https://github.com/AutoMapper/AutoMapper/wiki/Lists-and-arrays我想你想设置一个孩子父映射看标签“集合中的多态元素类型”这部分,这将允许你将事物映射到“产品”,但是如果它确实是“RatedProduct”,则指定如何映射它。 – 2013-05-08 14:56:32

相关问题