Вызов перегрузки метода расширения с производным типом - PullRequest
0 голосов
/ 01 июня 2018

Упрощенно, у меня есть эти 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 улова, который вызывает расширение на основе типа исключения.

Есть ли способвызвать правильный метод расширения во время выполнения?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Методы расширения здесь не тот инструмент.

Я бы посоветовал использовать полиморфизм для решения вашей проблемы:

public abstract class BaseException : Exception
{
    public abstract string GetString();
}

public sealed class TimeoutException : BaseException
{
    public override string GetString() => "TimeOut!!!";
}

public sealed class MyException : BaseException
{
    public override string GetString() => "Standard!!!";
}

Использование

try
{
    throw new TimeoutException(); //or whatever BaseException's children
}
catch (BaseException e)
{
    //here I'm assuming you know that you are swallowing the exception (which may be an anti-pattern)
    Console.WriteLine(e.GetString());
}

Редактировать

Похоже, вы не имеете полного контроля над тем, когда и когда создаются исключения.Другой возможностью было бы добавить 1 предложение catch для каждого поведения (а не для каждого типа исключения) и избавиться от GetString():

try
{
    throw new TimeoutException();
}
catch (Exception e) when (e is ArgumentNullException || e is FormatException)
{
    //do something
}
catch (Exception e) when (e is TimeoutException)
{
    //do something
}
catch (Exception e)
{
    throw new NotImplementedException($"Hey Mike, write something for {e.GetType()}, will ya?"); //idea from Jeroen
}
0 голосов
/ 01 июня 2018

Как предположил Якуб Массад, вы можете использовать dynamic, потому что с dynamic разрешение перегрузки метода откладывается во время выполнения до позднего связывания.

...