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




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






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



возможно ли это с отражением C#?

551   5  

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

    Ничего не найдено.