2013-05-08 43 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