2015-06-09 82 views
0

標題是也許沒有說清楚過載的方法,我會嘗試在一個例子來說明:C#檢查是否有與特定類型

我有一個自定義的DTO映射器替換AutoMapper,和當時需要他們兩人的工作。它有一個自定義實現使用它,否則回退到AutoMapper。

自定義映射器看起來是這樣的:

public static class CustomMapper 
{ 
    public static Entity1DTO Map(Entity1 source){ 
     ... some mapping code ... 
    } 

    public static Entity2DTO Map(Entity2 source){ 
     ... some mapping code ... 
    } 

    ... 
} 

我需要一種方法來檢查,如果Map方法節選特定類型,但不檢查手動每種類型。我試圖創建另一個過載,它接受object並返回object,但我不知道如何檢查其他過載是否滿足特定類型並調用它們。

基本上我想要做一個普通的包裝方法將處理重定向到CustomMapper或AutoMapper。喜歡的東西:

public static class Mapper 
{ 
    public static T Map<T>(object source){ 
     return CustomMapper.Map(source) ?? AutoMapper.Map(source); 
    } 
} 

所以,問題是如何使在CustomMapper的方法,將知道另一個Map方法重載可以處理接受的類型。如果沒有返回null或拋出異常,那麼我可以在包裝器中回退到AutoMapper。

回答

1

那麼,您的自定義映射器具有簡單的靜態方法,所以你可以採取一貫的重載的優勢:

public static T Map<T>(Entity1 source) { ... } 
public static T Map<T>(Entity2 source) { ... } 
public static T Map<T>(EntityN source) { ... } 

public static T Map<T>(object source) { ... } 

最後一個方法將是你AutoMapper備用 - 使用時有沒有更直接的過載。

要調用這個,你只需要做CustomMapper.Map<DTOEntityX>(whateverValue)。如果你還需要這與實時whateverValue工作,你可以使用dynamic - CustomMapper.Map<DTOEntityX>((dynamic)whateverValue);這將解決運行時的最佳過載問題。

完成轉換後,只需刪除回退方法即可完成。

+0

謝謝,但它更復雜。包裝方法接受bject,當它調用自定義映射器時,它總是進入最後一個方法(然後調用automapper)。此外,automapper如何處理數組存在一個問題,它將它們視爲T,而不是T [] ...所以基本上我堅持我的問​​題。如何根據類型變量調用適當的重載方法 – ZolaKt

+0

@ZolaKt你可以看到我根本沒有使用包裝器方法 - 如果這不是你的選擇(在這種情況下,爲什麼你甚至使用泛型? ),你可以把參數從'object'改成'dynamic',它應該可以正常工作。 – Luaan

相關問題