Присвоение имени общему действию / методу

#c#

#c#

Вопрос:

С примером кода что-то вроде этого:

     public static void Main(string[] args)
    {
        Action action = () =>
        {
            var x = 1;
            x  ;
        };

        Console.WriteLine(action.Method.Name);
    }
  

Выведет: <Main>b__0_0

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

Комментарии:

1. Ответ — нет, его сгенерировал компилятор, для этого вам нужно будет отредактировать скомпилированный код. Однако, в зависимости от варианта использования, вы можете использовать локальный метод, однако я уверен, что это не решит вашу проблему. Были разговоры о применении метаданных к lamda и так далее, но я не верю, что есть какое-либо желание реализовать это

Ответ №1:

По определению, лямбда-выражение компилируется в анонимный метод. Конечно, это немного неправильное название. У метода действительно есть имя, но это имя присваивается компилятором, и что касается остальной части скомпилированного кода, у метода вообще нет имени. Итак, нет … вы не можете изменить имя.

Однако, если вы используете C # 7 или более позднюю версию, у вас есть доступ к именованным локальным функциям. Такие функции все еще могут захватывать локальные переменные и в остальном вести себя во многом как анонимный метод. В вашем примере это может выглядеть так:

 public static void Main(string[] args)
{
    void M()
    {
        var x = 1;
        x  ;
    };
     
    Action action = M;

    Console.WriteLine(action.Method.Name);
}
  

Затем вы можете предоставить любое значимое имя, которое вы хотите (предположительно, что-то более значимое, чем M 🙂 ), и это будет показано в MethodInfo объекте для делегата.