简化后,我有这 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/