Pav*_*nin 8 .net c# reflection
考虑以下变体:
class A
{
public virtual void Doit()
{
}
}
class B : A
{
public new virtual void Doit()
{
}
}
Run Code Online (Sandbox Code Playgroud)
要么
class B : A
{
public override virtual void Doit()
{
}
}
Run Code Online (Sandbox Code Playgroud)
我无法找到返回的调用结果的差异 typeof(B).GetMethod("Doit");
在这两种情况下MethodInfo.DecalringType,B类和其他属性看起来都是一样的.我错过了什么或者没有办法区分它们吗?
更新:
当我在LINQPAd中运行示例时,我发现Attributes属性略有不同:
对于new virtual值为- PrivateScope,公共,虚拟HideBySig,VtableLayoutMask
为override- PrivateScope,公共,虚拟HideBySig
更新2:
我用Google搜索VtableLayoutMask并回到StackOverflow
Udate 3:
结果代码:
public static class MethodInfoExtensions
{
public static bool IsOverriden(this MethodInfo method)
{
Contract.Requires<ArgumentNullException>(method != null, "method");
return method.IsVirtual
&& !method.IsStatic
// overriden exactly in this class
&& method.ReflectedType == method.DeclaringType
// not new and not declared for the first time in the class
&& method.GetBaseDefinition() != method;
}
}
Run Code Online (Sandbox Code Playgroud)
DeclaringType如果用 隐藏的话会有所不同new。例如,运行:
public class A
{
public virtual void WillBeInheritted()
{
}
public virtual void WillBeOverridden()
{
}
public virtual void WillBeHidden()
{
}
}
public class B : A
{
public override void WillBeOverridden()
{
}
public virtual new void WillBeHidden()
{
}
}
class Program
{
public static void Main(string[] args)
{
foreach(var meth in typeof(B).GetMethods())
{
Console.Write(meth.Name);
Console.Write(": ");
Console.Write(meth.GetBaseDefinition().DeclaringType.Name);
Console.Write(" ");
Console.WriteLine(meth.DeclaringType.Name);
}
Console.Read();
}
}
Run Code Online (Sandbox Code Playgroud)
输出将是:
WillBeOverridden: A B
WillBeHidden: B B
WillBeInheritted: A A
WillBeHidden: A A
ToString: Object Object
Equals: Object Object
GetHashCode: Object Object
GetType: Object Object
Run Code Online (Sandbox Code Playgroud)
WillBeInherittedhasA作为方法和基本定义的声明类型的声明类型。
WillBeOverriddenhasA用于基本定义的声明类型,B用于声明类型。
WillBeHidden有两个版本,隐藏的版本A和隐藏的版本B。当我们考虑以下因素时,这是有道理的:
B b = new B();
A a = b;
b.WillBeHidden(); // calls hiding method.
a.WillBeHidden(); // calls hidden method on same object.
Run Code Online (Sandbox Code Playgroud)