Как получить имя и тип вызывающего метода с помощью отражения? [дубликат]
Возможные Дубликаты:
как я могу найти метод, который вызвал текущий метод?
Я хотел бы написать метод, который получает имя вызывающего метода и имя класса, содержащего вызывающий метод.
возможно ли это с отражением C#?
5 ответов:
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"
обновление два года спустя, так как я все еще получаю upvotes на этом
в .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; }The на
StackFrameмассив даст вам метод, который называетсяMyMethod
да, в принципе, это возможно, но это не приходят бесплатно.
вам нужно создать StackTrace, а потом вы можете посмотреть на кадр стека по стека вызовов.
технически, вы можете использовать StackTrace, но это очень медленно и не даст вам ответы, которые вы ожидаете много времени. Это связано с тем, что во время сборки выпуска может произойти оптимизация, которая удалит определенные вызовы методов. Поэтому вы не можете быть уверены в выпуске, является ли stacktrace "правильным" или нет.
действительно, нет никакого надежного или быстрого способа сделать это в C#. Вы действительно должны спросить себя, зачем вам это нужно и как вы можете создать свое приложение, поэтому вы может делать то, что вы хотите, не зная, какой метод называется.
Comments