有可能分辨出被覆盖和隐藏的方法吗?

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)

Jon*_*nna 3

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)