Возможный дубликат:
Как найти метод, который вызвал текущий метод?
Я хотел бы написать метод, который получает имя вызывающего метода, и имя класса, содержащего вызывающий метод.
Возможно ли это с отражением С#?
Возможный дубликат:
Как найти метод, который вызвал текущий метод?
Я хотел бы написать метод, который получает имя вызывающего метода, и имя класса, содержащего вызывающий метод.
Возможно ли это с отражением С#?
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
}
}
Вы можете использовать его с помощью 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);
На самом деле это может быть сделано с использованием комбинации текущих данных трассировки стека и отражения.
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
Да, в принципе это возможно, но это не приходит бесплатно.
Вам нужно создать StackTrace, а затем вы можете посмотреть стек StackFrame в стеке вызовов.
Технически вы можете использовать StackTrace, но это очень медленно и не даст вам ответов, которые вы ожидаете много времени. Это связано с тем, что во время выпуска сборок могут возникать оптимизации, которые позволят удалить определенные вызовы методов. Следовательно, вы не можете быть уверены в том, что stacktrace "правильно" или нет.
На самом деле, нет никакого надежного или быстрого способа сделать это на С#. Вы действительно должны спрашивать себя, зачем вам это нужно, и как вы можете архитектовать свое приложение, чтобы вы могли делать то, что хотите, не зная, какой метод его назвал.