Можно ли получить фактический тип из трассировки стека? - PullRequest
4 голосов
/ 31 января 2011

Я пишу класс ExceptionFactory, используя System.Diagnostics.StackTrace.

 var trace = new StackTrace(1, true);
 var frames = trace.GetFrames();
 var method =  frames[0].GetMethod();

Теперь для классов

class Base
{
   public void Foo()
   {
      //Call ExceptionFactory from here
   }
} 
class A : Base {}

//...

var x = new A();
x.Foo();

method.DeclaringType вернется typeof(Base). Однако мне нужно typeof(A). Можно ли как-нибудь получить?

method.ReflectedType тоже не работает.

Ответы [ 2 ]

4 голосов
/ 31 января 2011

Нет, поскольку метод фактически объявлен на Base. Пока метод не переопределен, вы всегда получаете один и тот же экземпляр MethodInfo для метода независимо от того, запрашиваете ли вы его в базовом классе или в производном классе.

Но зачем вам второй тип? Может быть другое решение вашей проблемы, поэтому я спрашиваю об этом.

0 голосов
/ 31 января 2011

Да, просто используйте this.GetType(). Это вернет подкласс. Таким образом, следующий фрагмент кода должен напечатать «A».

public void Foo()
{
    System.Diagnostics.Debug.Print(this.GetType().ToString());
}
...