c# - 使用派生类型调用扩展方法重载

标签 c# casting extension-methods

简化后,我有这 2 个 Extension 方法:

public static class Extensions
{
    public static string GetString(this Exception e)
    {
        return "Standard!!!";
    }
    public static string GetString(this TimeoutException e)
    {
        return "TimeOut!!!";
    }
}

这是我使用它们的地方:

try
{
    throw new TimeoutException();
}
catch (Exception e)
{
    Type t = e.GetType(); //At debugging this a TimeoutException
    Console.WriteLine(e.GetString()); //Prints: Standard
}

我有更多的 GetString() 扩展。

我的 try{...}catch{...} 越来越大,基本上我在寻找方法将它缩短到 1 个 catch,它根据异常类型调用扩展.

有没有办法在运行时调用正确的扩展方法?

最佳答案

正如 Yacoub Massad 建议的那样,您可以使用 dynamic,因为使用 dynamic 方法时,重载解析会通过后期绑定(bind)在运行时延迟。

public static class Extensions
{
    public static string GetString<T>(this T e) where T : Exception
    {
        // dynamic method overload resolution is deferred at runtime through late binding.
        return GetStringCore((dynamic)e);
    }

    static string GetStringCore(Exception e)
    {
        return "Standard!!!";
    }

    static string GetStringCore(TimeoutException e)
    {
        return "TimeOut!!!";
    }

    static string GetStringCore(InvalidOperationException e)
    {
        return "Invalid!!!";
    }
}

这应该可以解决问题。

关于c# - 使用派生类型调用扩展方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50641508/

相关文章:

c# - 未找到扩展方法(不是程序集引用问题)

c# - WPF中不同元素类型列表的布局

c# - HttpContext.Current.User.Identity.Name 在 .ashx 处理程序中不起作用

javascript - 当我使用 parseInt 时,结果是 NaN,为什么?

c# - 将第二个索引器添加到 Math.NET Numerics

javascript - 如何在 html 页面中使用从 native 应用程序接收的数据?

c# - 最小起订量和 "as"关键字

c# - 类型化数据集的正确用法

c# - 为什么我应该用 "unchecked"明确包围?

c++ - 我可以将一个对象类转换为它在其中实现的接口(interface)指针吗?