c#-4.0 - 使用动态关键字调用子类方法

标签 c#-4.0 inheritance dynamic

我有几个类都实现了一个接口(interface)IBar .这些类(class)是BarA , BarB , BarC .

我还有一个基类 Foo :

abstract class Foo
{
    void Do(IBar bar)
    {
        Handle((dynamic)bar);
    }

    void Handle(IBar bar)
    {
        Console.Out.WriteLine("Fallback Scenario");
    }
}

我想要一个 child 类FooChild如下:
class FooChild : Foo
{
    void Handle(BarA bar) {
        Console.Out.WriteLine("Handling BarA");
    }

    void Handle(BarB bar) {
        Console.Out.WriteLine("Handling Bar");
    }
}

不,我想做以下事情,但我没有得到我期望的结果
var foo = new FooChild();
foo.Handle(new BarA()); // expected: Handling BarA, actual: Fallback Scenario
foo.Handle(new BarB()); // expected: Handling BarB, actual: Fallback Scenario
foo.Handle(new BarC()); // expected: Fallback Scenario, actual: Fallback Scenario

我可以通过移动 Do(IBar bar) 来解决它FooChild 的方法课,但我不想那样做。我可能有 10 Foo children ,不想重复该代码。有解决方案吗?

最佳答案

我想你想要这个:

void Do(IBar bar)
{
    dynamic dynamicThis = this;
    dynamicThis.Handle((dynamic) bar);
}

这样,将根据 this 的实际类型找到该方法。 .否则,编译器会记住该方法是从 Foo 调用的。 , 并且只动态处理参数,查找可以从 Foo 获得的方法实际类型为 bar .您想要的方法可以从 this 的实际类型中获得。 ,以及使用 bar 的实际类型(通过转换为 dynamic )。

(不过,您需要公开 Handle 方法。)

关于c#-4.0 - 使用动态关键字调用子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16691526/

相关文章:

C# 动态对象初始值设定项无法编译

scala - 堆叠特征中 super 的含义取决于调用站点?

dynamic - 在 Django 中,如何后期绑定(bind)未绑定(bind)的表单?

c# - 如何在 C# 中将 Base64 PNG 图像字符串转换为 PNG 格式

c#-4.0 - Parallel.ForEach 中的 Counter++

c# - System.IO.File.Delete 抛出算术运算导致溢出

java - Intellij/Android Studio 可以将多个 catch block 合并为一个吗?

python - 部分继承 - 继承一些功能,减去有问题的方法

linux - 如何在已编译的应用程序中替换 main()?

c - 试图了解此 C 程序中静态和动态作用域之间的区别