使用动态关键字调用子类方法

时间:2013-05-22 12:16:38

标签: c#-4.0 inheritance dynamic

我有几个类都在实现接口IBar。这些课程为BarABarBBarC

我还有一个基类Foo

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

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

我想要一个如下的儿童班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个孩子,并且不想重复该代码。有解决方案吗?

1 个答案:

答案 0 :(得分:3)

我想你想要这个:

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

这样,该方法将针对this实际类型找到。否则,编译器会记住该方法是从Foo调用的,并且只动态处理参数,找到Foo可用的实际类型{{}}的方法。 {1}}。您需要从bar的实际类型中获得的方法,以及使用this的实际类型(通过强制转换为bar)。

(您需要公开dynamic方法。)