C#检查是否存在具有特定类型的重载方法

时间:2015-06-09 09:04:28

标签: c# generics reflection overloading mapper

标题可能不那么明确,我试着解释一个例子:

我用自定义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 个答案:

答案 0 :(得分: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);这将解决运行时的最佳重载。

完成转换后,只需删除后备方法,即可完成。