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

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

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

Возможно ли это с reflectionм C #?

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

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

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

имя будет «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 , а затем вы можете посмотреть стек стека в стеке стека.

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

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

  • Используя reflection, как вы устанавливаете значение поля struct?
  • Как использовать reflection для вызова частного метода?
  • Как использовать метод отражения для вызова по имени
  • Как скрыть общественные методы от intellisense
  • Как вы получаете имя переменной, поскольку оно было физически напечатано в его объявлении?
  • Можно ли создать экземпляр вложенного classа с помощью Java Reflection?
  • Как перечислить все переменные classа
  • Вызов статического метода с использованием отражения
  • GetProperties () возвращает все свойства иерархии наследования интерфейса
  • C # Использование Reflection для копирования свойств базового classа
  • Что может вызвать java.lang.reflect.InvocationTargetException?
  • Interesting Posts

    Проводка данных JSON через jQuery для действия controllerа ASP.NET MVC 4

    Что такое fastest children () или find () в jQuery?

    Использование функции в Sass возвращает строку, содержащую имя функции, а не результат

    Почему он неодобрительно использует пустой макет в Swing?

    android studio 0.4.2: Ошибка синхронизации с ошибкой проекта Gradle

    Встроенная клавиатура и мышь ноутбука Acer не работают в Windows

    Как настроить mspaint на Windows Server 2008R2 / Win 7 для запуска с 1-пиксельным холстом или автоматической обрезкой вставленного изображения?

    Как определить, соответствует ли список точек полигона по часовой стрелке?

    Стоимость чтения / записи диска в сравнении с записью

    Тип или имя пространства имен «DbContext» не удалось найти

    jqgrid: как установить параметры панели инструментов на основе значения столбца в строке

    Как автоматически создать резервную копию файла в OneDrive?

    Excel: Как получить динамическую формулу, которая может отображать общее количество уникальных значений в диапазоне?

    Как определить конец загрузки UITableView

    .Net против сборщика мусора Java

    Давайте будем гением компьютера.