Как я могу найти метод, который вызвал текущий метод? - PullRequest
434 голосов
/ 05 октября 2008

При входе в C #, как узнать имя метода, вызвавшего текущий метод? Я знаю все о System.Reflection.MethodBase.GetCurrentMethod(), но я хочу сделать еще один шаг в трассировке стека. Я рассмотрел анализ трассировки стека, но я надеюсь найти более понятный и понятный способ, например, Assembly.GetCallingAssembly(), но для методов.

Ответы [ 19 ]

6 голосов
/ 06 октября 2008

Может быть, вы ищете что-то вроде этого:

StackFrame frame = new StackFrame(1);
frame.GetMethod().Name; //Gets the current method name

MethodBase method = frame.GetMethod();
method.DeclaringType.Name //Gets the current class name
4 голосов
/ 04 марта 2011
private static MethodBase GetCallingMethod()
{
  return new StackFrame(2, false).GetMethod();
}

private static Type GetCallingType()
{
  return new StackFrame(2, false).GetMethod().DeclaringType;
}

Фантастический класс здесь: http://www.csharp411.com/c-get-calling-method/

2 голосов
/ 16 октября 2008

Другой подход, который я использовал, заключается в добавлении параметра к рассматриваемому методу. Например, вместо void Foo() используйте void Foo(string context). Затем передайте некоторую уникальную строку, которая указывает на вызывающий контекст.

Если вам нужен только вызывающий / контекст для разработки, вы можете удалить param перед отправкой.

1 голос
/ 30 мая 2013

Мы также можем использовать лямбду, чтобы найти звонящего.

Предположим, у вас есть определенный вами метод:

public void MethodA()
    {
        /*
         * Method code here
         */
    }

и вы хотите найти его вызывающего.

1 . Измените сигнатуру метода, чтобы у нас был параметр типа Action (Func также будет работать):

public void MethodA(Action helperAction)
        {
            /*
             * Method code here
             */
        }

2 . Лямбда-имена не генерируются случайным образом. Правило выглядит так:> __ X где CallerMethodName заменяется предыдущей функцией, а X является индексом.

private MethodInfo GetCallingMethodInfo(string funcName)
    {
        return GetType().GetMethod(
              funcName.Substring(1,
                                funcName.IndexOf(">", 1, StringComparison.Ordinal) - 1)
              );
    }

3 . При вызове MethodA параметр Action / Func должен быть сгенерирован методом вызывающей стороны. Пример: * +1021 *

MethodA(() => {});

4 . Внутри MethodA теперь мы можем вызвать вспомогательную функцию, определенную выше, и найти MethodInfo метода вызывающего.

Пример: * * тысяча двадцать-восемь

MethodInfo callingMethodInfo = GetCallingMethodInfo(serverCall.Method.Name);
1 голос
/ 14 декабря 2012
StackFrame caller = (new System.Diagnostics.StackTrace()).GetFrame(1);
string methodName = caller.GetMethod().Name;

будет достаточно, я думаю.

1 голос
/ 05 октября 2008

Взгляните на Имя метода ведения журнала в .NET . Остерегайтесь использовать его в производственном коде. StackFrame может быть ненадежным ...

1 голос
/ 27 декабря 2018

Для получения имени метода и имени класса попробуйте это:

    public static void Call()
    {
        StackTrace stackTrace = new StackTrace();

        var methodName = stackTrace.GetFrame(1).GetMethod();
        var className = methodName.DeclaringType.Name.ToString();

        Console.WriteLine(methodName.Name + "*****" + className );
    }
0 голосов
/ 27 декабря 2018

Дополнительная информация к ответу Firas Assaad.

Я использовал new StackFrame(1).GetMethod().Name; в ядре .net 2.1 с внедрением зависимости, и я получаю вызывающий метод как «Пуск».

Я пытался с [System.Runtime.CompilerServices.CallerMemberName] string callerName = "" и это дает мне правильный метод вызова

0 голосов
/ 06 июля 2015
var callingMethod = new StackFrame(1, true).GetMethod();
string source = callingMethod.ReflectedType.FullName + ": " + callingMethod.Name;
...