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

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

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

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

5 Solutions collect form web for “Как получить имя и тип вызывающего метода с помощью отражения?”

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 #. Вы действительно должны спрашивать себя, зачем вам это нужно, и как вы можете архитектовать свое приложение, чтобы вы могли делать то, что хотите, не зная, какой метод его назвал.

  • ClassCastException при литье в один class
  • Как использовать reflection для вызова общего метода?
  • Быстрое создание объектов вместо Activator.CreateInstance (type)
  • Вызов статического метода с использованием отражения
  • C # Reflection: Как получить ссылку на class из строки?
  • Convert.ChangeType () не работает в Nullable Types
  • Как получить путь сборки, в которой находится код?
  • Насколько дорого стоит .NET-reflection?
  • Как заставить Java-метод возвращать общий список любого типа?
  • Проверьте, является ли class производным от общего classа
  • Как определить, реализует ли тип определенного типа общего типа
  • Interesting Posts

    MVC 3 jQuery Проверка / глобализация числа / десятичного поля

    Старается ли неиспользованная термопаста?

    Как вызвать JSF-бэк-метод только в том случае, когда onclick / oncomplete / on … происходит событие, а не на загрузке страницы

    Избегайте непечатаемых символов в функции для приглашения Bash

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

    Почему у моего VPS заканчивается память?

    Быстрый и простой способ объединения элементов массива с разделителем (противоположность split) в Java

    Как использовать завиток, чтобы проверить, отменен ли сертификат сайта?

    Как объединить ячейки в jqGrid 4.0

    Как создать клиент чата XMPP для facebook?

    Почему размер жесткого диска ниже фактического?

    Как ssh на машине VirtualBox?

    Как создать локальные уведомления в iOS?

    Как разобрать JSON из Java HTTPResponse?

    Pentadactyl – установить внешний редактор на vim termnial

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