DeclaringType和ReflectedType之间的区别

Khu*_*san 41 c# .net-4.0

有谁可以告诉这两个属性之间的区别?

DeclaringTypeReflectedType

考虑代码是:

public class TestClass
{
    public static void TestMethod()
    {
        Console.WriteLine("Method in Class", MethodBase.GetCurrentMethod().DeclaringType.Name);
        Console.WriteLine("Method in Class", MethodBase.GetCurrentMethod().ReflectedType.Name);
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是否可以互换使用?

dca*_*tro 59

他们并不完全一样.

  • DeclaringType 返回声明方法的类型.
  • ReflectedType返回Type用于检索方法的对象.

这是一个演示:

MemberInfo m1 = typeof(Base).GetMethod("Method");
MemberInfo m2 = typeof(Derived).GetMethod("Method");

Console.WriteLine(m1.DeclaringType); //Base
Console.WriteLine(m1.ReflectedType); //Base

Console.WriteLine(m2.DeclaringType); //Base
Console.WriteLine(m2.ReflectedType); //Derived

public  class Base
{
    public void Method() {}
}

public class Derived : Base { }
Run Code Online (Sandbox Code Playgroud)

注意到最后一行如何打印Derived而不是Base.这是因为,即使Method宣称Base,我们用Derived获得的MemberInfo对象.

资料来源:MSDN

  • 比较问题的例子,注意如果你在`Base`里面的`Method()`里面调用`MethodBase.GetCurrentMethod()`,然后在`Derived`的实例上调用那个方法(如`new Derived().Method();`),你确实没有***得到你所希望的`m2`.你得到`m1`​​.这是需要注意的事情. (2认同)
  • 与前一个注释相同,从StackFrame(vi StackTrace)通过GetMethod检索的方法也会丢失"反射"位. (2认同)