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

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

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

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

154
задан Community 23 May 2017 в 12:18
поделиться

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»

ОБНОВЛЕНИЕ Два года спустя, так как я все еще получаю голоса за этот

In. Net 4.5 теперь есть гораздо более простой способ сделать это. Вы можете воспользоваться атрибутом CallerMemberNameAttribute

В предыдущем примере:

public class SomeClass
{
    public void SomeMethod([CallerMemberName]string memberName = "")
    {
        Console.WriteLine(memberName); //output will be name of calling method
    }
}
415
ответ дан 23 November 2019 в 21:58
поделиться

Да, в принципе это возможно, но не бесплатно.

Вам нужно создать StackTrace , а затем вы можете посмотреть на StackFrame стека вызовов.

7
ответ дан 23 November 2019 в 21:58
поделиться

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

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

11
ответ дан 23 November 2019 в 21:58
поделиться

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

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

7
ответ дан 23 November 2019 в 21:58
поделиться

Вы можете использовать его с помощью 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);
21
ответ дан 23 November 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: