一尘不染

有什么方法可以调用覆盖方法的父版本?(C#.NET)

c#

在下面的代码中,我尝试了两种方法来访问methodTwo的父版本,但结果始终为2。是否有任何方法可以在不修改这两个类的情况下从ChildClass实例获取1结果?

class ParentClass
{
    public int methodOne()
    {
        return methodTwo();
    }

    virtual public int methodTwo()
    {
        return 1;
    }
}

class ChildClass : ParentClass
{
    override public int methodTwo()
    {
        return 2;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var a = new ChildClass();
        Console.WriteLine("a.methodOne(): " + a.methodOne());
        Console.WriteLine("a.methodTwo(): " + a.methodTwo());
        Console.WriteLine("((ParentClass)a).methodTwo(): "
         + ((ParentClass)a).methodTwo());
        Console.ReadLine();
    }
}

更新 ChrisW发布:

从课堂之外,我不知道有什么简单的方法。但是,也许,我不知道如果尝试反射会发生什么:使用Type.GetMethod方法在ParentClass中找到与该方法关联的MethodInfo,然后调用MethodInfo.Invoke

该答案已删除。我想知道这种破解是否可以工作,只是出于好奇。


阅读 268

收藏
2020-05-19

共1个答案

一尘不染

在IL级别,您可以发出a call而不是a callvirt来完成工作-但是,如果我们将自己限制为C#;-p( 编辑
darn!运行时将停止您VerificationException::“操作可能会使运行时不稳定。”;删除的virtual,它工作正常;太聪明了一半…)

ChildClass类型内部,您可以使用base.methodTwo()-但是,这在外部是不可能的。您也不能下降超过一个级别-
没有base.base.Foo()支持。

但是,如果使用方法隐藏禁用多态,则可以得到所需的 答案 ,但原因很糟糕:

class ChildClass : ParentClass
{
    new public int methodTwo() // bad, do not do
    {
        return 2;
    }
}

现在,根据变量定义为a ChildClass还是a,您可以从同一对象获得不同的答案ParentClass

2020-05-19