Использование MethodInfo.GetCurrentMethod () в анонимных методах - PullRequest
7 голосов
/ 16 января 2011
public static void Main(string[] args)
{
    Action a = () => Console.WriteLine(MethodInfo.GetCurrentMethod().Name);
    a();
}

Этот код возвратит неясную строку, например, так: <Main>b__0.

Есть ли способ игнорировать анонимные методы и получить более читаемое имя метода?

Ответы [ 3 ]

6 голосов
/ 16 января 2011

Вы можете захватить его снаружи:

var name = MethodInfo.GetCurrentMethod().Name + ":subname";
Action a = () => Console.WriteLine(name);

Кроме этого; нет.

6 голосов
/ 16 января 2011

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

public static void Main()
{
    Action<string> a = name => Console.WriteLine(name);
    a(MethodInfo.GetCurrentMethod().Name);
}

или, если вы действительно хотите значимое имя, вам нужно будет указать его:

public static void Main()
{
    Action a = MeaningfullyNamedMethod;
    a();
}

static void MeaningfullyNamedMethod()
{
    Console.WriteLine(MethodInfo.GetCurrentMethod().Name);
}
3 голосов
/ 16 января 2011

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

Для получения дополнительной информации см .: http://www.csharp -examples.net / expression-call-method-name /

...