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设计错误。他们可能有一个相当具体的想法。我认为最好是跟踪<代码>类型<代码>,而不是向反射对象添加这个哈克。