C# 去极化型与反射型的区别

C# 去极化型与反射型的区别,c#,.net-4.0,C#,.net 4.0,有人能告诉我这两种属性的区别吗? DeclaringType和ReflectedType 请考虑以下代码: public class TestClass { public static void TestMethod() { Console.WriteLine("Method in Class", MethodBase.GetCurrentMethod().DeclaringType.Name); Console.WriteLine("Method

有人能告诉我这两种属性的区别吗?

DeclaringType
ReflectedType

请考虑以下代码:

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);
    }
}

它们是相同的并且可以互换使用吗?它们不完全相同

  • 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 { }
注意到最后一行是如何打印的
派生的
,而不是
Base
。这是因为,即使
方法
是在
上声明的,我们还是使用
派生
来获取
成员信息
对象


来源:

比较问题中的示例,注意如果您在
方法()中调用
方法()
基础中调用
方法库.GetCurrentMethod()
,然后在
派生的
实例上调用该方法(如
新派生的().Method();
),您没有得到您所希望的
m2
。您将获得
m1
。这是需要注意的。与前面的注释相同,通过GetMethod从StackFrame(vi StackTrace)检索的方法也会丢失“反射”位。可能值得注意的是,在派生类型中重写的方法被认为是在派生类型中声明的,而不是在基类型中声明的。现在,如果
Base
将覆盖
方法
,则
派生的
DeclaringType
ReflectedType
方法将是相同的。@ZevSpitz
方法
已经是
Base
的本机成员
Base
不会覆盖它。如果
Derived
会覆盖它,这是正确的。@Suncat2000我可能就是这个意思——如果
Derived
有一个覆盖的
方法
。如果有人想知道
ReflectedType
为什么存在:在我看来,这是一个.NET 1.0设计错误。他们可能有一个相当具体的想法。我认为最好是跟踪<代码>类型<代码>,而不是向反射对象添加这个哈克。