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

C# 4.0 使用动态关键字调用子类方法,c#-4.0,inheritance,dynamic,C# 4.0,Inheritance,Dynamic,我有几个类都实现了一个接口IBar。这些类是BarA,BarB,BarC 我还有一个基类Foo: abstract class Foo { void Do(IBar bar) { Handle((dynamic)bar); } void Handle(IBar bar) { Console.Out.WriteLine("Fallback Scenario"); } } 我想要一个子类FooChild,如下所示:

我有几个类都实现了一个接口
IBar
。这些类是
BarA
BarB
BarC

我还有一个基类
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
孩子,不想重复那个代码。有什么解决办法吗?

我想你想要这个:

void Do(IBar bar)
{
    dynamic dynamicThis = this;
    dynamicThis.Handle((dynamic) bar);
}
这样,将根据实际类型的
this
找到该方法。否则,编译器会记住该方法是从
Foo
调用的,并且只动态处理参数,查找从
Foo
可用的、实际类型为
bar
的方法。您需要从实际类型的
this
以及使用实际类型的
bar
(通过转换为
dynamic
)提供的方法


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

嗨,Jon,谢谢您的回答!它几乎奏效了;我必须在方法调用中保留(动态)强制转换才能使其成功工作。@avanwieringen:啊,是的,否则它仍然会尝试使用编译时类型。我将为未来的访问者修正我的答案。因此,如果我是正确的,动态关键字将基于运行时知识而不是编译时知识进行匹配?@avanwieringen:这是动态表达式的行为,是的。但是编译器保留了它作为这些表达式的一部分所拥有的任何编译时知识-因此,如果您有
方法(x,y)
,其中
x
的编译时类型是
动态的
,而
y
的编译时类型只是
对象
,它将只匹配第二个参数为
object
的方法,而不管执行时间类型是
y
。值得注意的是:当我的FooChild是嵌套的私有类时(对于单元测试),这不起作用。把它公之于众是可行的。奇怪的是,为什么RuntimeBinder无法正确解析方法,即使通过调试器它看起来很好。