Попробуйте Catch Extension для основного метода? - PullRequest
0 голосов
/ 05 июня 2018

У меня есть этот класс Logger:

public static class Logger
{
    public static void LogError(Exception e)
    {

    }

    public static void TryCatchLogError<T>(this T item, Action action)
    {
        try
        {
            action();
        }
        catch (Exception ex)
        {
            LogError(ex);
        }
    }
}

Я могу сделать это:

public partial class Form1 : Form
{
    public void GetBreakDownMachine()=>  this.TryCatchLogError(() =>
    {
        {
            //my code
        }
    });
}

Но не могу сделать то же самое внутри моего статического основного класса

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()=>  this.TryCatchLogError(() =>
    {
        {
            //my code
        }
    });
}

Как я могу использовать класс расширения Logger для вышеуказанного статического метода?

Ответы [ 2 ]

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

Вашему методу нужен 'item', но Main не предоставляет его.В Main нет «этого».

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

Вы можете сделать основной метод класса Выражением Bodied Member , вот так (по крайней мере, для консольного приложения)

private static void Main(string[] args) => Console.WriteLine("asdasd");

Однако, это довольно уродливо, и яникогда бы не сделал это лично.Кроме того, целое выражение попытка поймать вещь тоже не устраивает меня.Это просто дополнительный вызов стека, чтобы запятнать трассировку стека, и, что хуже всего, вы не имеете дело с исключением и просто используете общий ловушку.

Я бы пересмотрел оба подхода

Если вы действительно хотите спуститься в эту кроличью нору, вам нужно пройти в T Item

public static void TryCatchLogError<T>(this T item, Action action)
{
   try
   {
      action();
   }
   catch (Exception ex)
   {
     // LogError(ex);
   }
}

private static void Main() => 
   TryCatchLogError("asd",  // <== here needs to be T Item
      () =>
         {
            Console.WriteLine("asdasd");
         });
...