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

Возможный дубликат:
Как найти метод, который вызвал текущий метод?

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

Возможно ли это с отражением С#?

Ответ 1

public class SomeClass
{
    public void SomeMethod()
    {
        StackFrame frame = new StackFrame(1);
        var method = frame.GetMethod();
        var type = method.DeclaringType;
        var name = method.Name;
    }
}

Теперь скажем, что у вас есть другой класс:

public class Caller
{
   public void Call()
   {
      SomeClass s = new SomeClass();
      s.SomeMethod();
   }
}

name будет "Call", и тип будет "Caller"

ОБНОВЛЕНИЕ Два года спустя, так как я все еще получаю поддержку на этом

В .Net 4.5 теперь есть намного более простой способ сделать это. Вы можете использовать CallerMemberNameAttribute

Переход с предыдущим примером:

public class SomeClass
{
    public void SomeMethod([CallerMemberName]string memberName = "")
    {
        Console.WriteLine(memberName); //output will be name of calling method
    }
}

Ответ 2

Вы можете использовать его с помощью StackTrace, а затем вы можете получить отражающие типы.

StackTrace stackTrace = new StackTrace();           // get call stack
StackFrame[] stackFrames = stackTrace.GetFrames();  // get method calls (frames)

StackFrame callingFrame = stackFrames[1];
MethodInfo method = callingFrame.GetMethod();
Console.Write(method.Name);
Console.Write(method.DeclaringType.Name);

Ответ 3

На самом деле это может быть сделано с использованием комбинации текущих данных трассировки стека и отражения.

public void MyMethod()
{
     StackTrace stackTrace = new System.Diagnostics.StackTrace();
     StackFrame frame = stackTrace.GetFrames()[1];
     MethodInfo method = frame.GetMethod();
     string methodName = method.Name;
     Type methodsClass = method.DeclaringType;
}

Индекс 1 в массиве StackFrame даст вам метод, который называется MyMethod

Ответ 4

Да, в принципе это возможно, но это не приходит бесплатно.

Вам нужно создать StackTrace, а затем вы можете посмотреть стек StackFrame в стеке вызовов.

Ответ 5

Технически вы можете использовать StackTrace, но это очень медленно и не даст вам ответов, которые вы ожидаете много времени. Это связано с тем, что во время выпуска сборок могут возникать оптимизации, которые позволят удалить определенные вызовы методов. Следовательно, вы не можете быть уверены в том, что stacktrace "правильно" или нет.

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