Возможный дубликат:
Как я могу найти метод который названным существующим методом?Я хотел бы записать метод, который получает название вызывающего метода и название класса, содержащего вызывающий метод.
Действительно ли это возможно с отражением C#?
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();
}
}
имя будет «Call», а тип будет «Caller»
ОБНОВЛЕНИЕ Два года спустя, так как я все еще получаю голоса за этот
In. Net 4.5 теперь есть гораздо более простой способ сделать это. Вы можете воспользоваться атрибутом CallerMemberNameAttribute
В предыдущем примере:
public class SomeClass
{
public void SomeMethod([CallerMemberName]string memberName = "")
{
Console.WriteLine(memberName); //output will be name of calling method
}
}
Да, в принципе это возможно, но не бесплатно.
Вам нужно создать StackTrace , а затем вы можете посмотреть на StackFrame стека вызовов.
На самом деле это то, что можно сделать, используя комбинацию текущих данных трассировки стека и отражения.
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, но это очень медленно и не даст вам ответов, которые вы ожидаете в большинстве случаев. Это связано с тем, что во время сборки выпуска может происходить оптимизация, которая удаляет определенные вызовы методов. Следовательно, вы не можете быть уверены в выпуске, является ли stacktrace «правильным» или нет.
На самом деле, в C # нет надежного или быстрого способа сделать это. Вы действительно должны спросить себя, зачем вам это нужно и как вы можете спроектировать свое приложение, чтобы вы могли делать то, что хотите, не зная, какой метод вызвал это.
Вы можете использовать его с помощью 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);