如何使用扩展构建双重调度

本文关键字:调度 构建 何使用 扩展 | 更新日期: 2023-09-27 18:22:25

我有一个库,它有如下的类层次结构:

class Base {}
class A : Base {}
class B : Base {}

现在我想做不同的事情,这取决于我的对象的类型,无论是A还是B。因此,我决定采用并实现双重调度,以避免检查类型。

class ClientOfLibrary {
    public DoStuff(Base anObject)
    {
       anObject.MakeMeDoStuff(this);
    }
    private void DoStuffForanA(A anA);
    private void DoStuffForaB(B aB);
}

现在实现双重调度的规范方法是在Base中抽象方法MakeMeDoStuff,并在具体类中重载它。但请记住,BaseAB都在库中,所以我不能自由添加do方法。

添加方法扩展不起作用,因为无法添加抽象扩展。

有什么建议吗?

如何使用扩展构建双重调度

您只需使用dynamic调用:

class ClientOfLibrary {
    public DoStuff(Base o)
    {
       DoStuffInternal((dynamic)o);
    }
    private void DoStuffInternal(A anA) { }
    private void DoStuffInternal(B aB) { }
    private void DoStuffInternal(Base o) { /* unsupported type */ }
}

自从引入dynamic以来,C#本机支持多调度,因此在大多数情况下不需要实现访问者模式。