2015-06-09 45 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

相关问题