C# 是否可以从堆栈跟踪中获取实际类型?

C# 是否可以从堆栈跟踪中获取实际类型?,c#,.net,reflection,stack-trace,C#,.net,Reflection,Stack Trace,我正在使用System.Diagnostics.StackTrace编写一个ExceptionFactory类 var trace = new StackTrace(1, true); var frames = trace.GetFrames(); var method = frames[0].GetMethod(); 现在上课 class Base { public void Foo() { //Call ExceptionFactory from here

我正在使用
System.Diagnostics.StackTrace
编写一个ExceptionFactory类

 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)
。有可能得到什么吗


方法。ReflectedType也不起作用。

否,因为该方法实际上是在
基础上声明的。只要不重写该方法,无论是在基类上还是在派生类上查询该方法,都会为该方法获得相同的
MethodInfo
实例


但是为什么你首先需要另一种呢?您的问题可能还有另一种解决方案,这就是我问这个问题的原因。

是的,只需使用
this.GetType()
。这将返回子类。因此,下面的代码段应该打印“A”


什么是ExceptionFactory?它根据调用的位置(例如:模块、调用类型的自定义属性等)参数化自定义异常,这就是我需要实际类型的原因,因此我可以查询类a的属性而不是类BaseReflectedType为什么不起作用?它会返回什么?@TDaver:请记住StackTrace可能不会包含您期望的所有帧,因为JIT可以优化方法调用。Martinho是正确的。除此之外,从堆栈帧中获取参数在一般情况下是不可能的,因此您可能无法实现您想要的。对于发布版本尤其如此。另请参见:据我所知,
ExceptionFactory
是一个独立的类,它依赖堆栈跟踪来生成异常;因此,很可能没有“this”可用。确切地说,尽管没有其他解决方案,它将采用类型参数(但这不是很好,因为它只与跟踪的第一级相对应,因此不是全局解决方案…)只要您在方法内部,或者至少在同一类型内,这就可以工作。当您在另一个类型中调用一个方法时,无论被调用的帮助器方法是否是静态的,这(显然)将不再是一个选项。@TDaver您不能将“this”传递给ExceptionFactory构造函数吗?ExceptionFactory是静态的,没有理由只为一次“抛出”创建一个新实例…我的基类包含基本操作(如删除、插入等)。如果有任何错误,我想提出一个异常,找出操作类型(插入、删除等)、层(业务逻辑、数据访问等)和错误位置的模块。但是,如果问题在类A中,在模块“Project1”中,而base在“Framework”中,我希望该模块是“Project1”,但由于异常是在base中提出的,我将得到“Framework”…如果“Framework”中定义的成员是虚拟的或抽象的,然后被“Project1”类覆盖,您将获得所需的信息……我已经决定,在非重写的情况下,我将自己为exceptionFactory提供所需的数据(模块和实际类名)。如果没有提供,它将搜索StackTrace。
public void Foo()
{
    System.Diagnostics.Debug.Print(this.GetType().ToString());
}