#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
объекте для делегата.