我有几个类都实现了一个接口(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/