c# - 通过扩展方法实现多态性?

标签 c# .net polymorphism extension-methods

我有一个类库,其中包含一些基类和派生自它们的其他类。在这个类库中,我利用多态性来做我想做的事。现在在一个消费应用程序中,我想根据子类的运行时类型更改某些代码的行为。所以假设如下:

public class Base { }
public class Child1 : Base { }
public class Child2 : Base { }

现在在消费应用程序中我想做如下事情(注意以下所有类都在消费应用程序中,不能在类库中引用):

public interface IMyInterface1 { }
public interface IMyInterface2 { }
public static class Extensions
{
    public static void DoSomething(this Base myObj, Object dependency)
    {

    }

    public static void DoSomething(this Child1 myObj, Object dependency)
    {
        IMyInterface1 myInterface = dependency as IMyInterface1;
        if (myInterface != null)
        {
            //Do some Child1 specific logic here
        }
    }

    public static void DoSomething(this Child2 myObj, Object dependency)
    {
        IMyInterface2 myInterface = dependency as IMyInterface2;
        if (myInterface != null)
        {
            //Do some Child2 specific logic here
        }
    }
}

更新:

这是行不通的。它总是调用基类的扩展方法。有没有其他方法可以让我这样做并避免显式检查运行时类型?原因是因为可以添加更多从 Base 派生的类,并且相应的扩展方法可以来自其他一些外部程序集。

提前致谢。

最佳答案

正如@SLaks 已经声明的那样,您不能将该方法作为扩展方法调用(即使使用 dynamic 类型)...但是您可以使用 dynamic 调用静态方法类型

所以,虽然这会失败

Base base1 = new Child1();
(base1 as dynamic).DoSomething();

这会起作用

Base base1 = new Child1();
Extensions.DoSomething(base1 as dynamic);

关于c# - 通过扩展方法实现多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20707317/

相关文章:

c# - 调试在 64 位环境中运行的 32 位应用程序

c# - Nhibernate和MVC3书籍

c# - 将对象转换为 int 的更好方法

java - 如果相同的方法重载和覆盖,Java 中的意外多态行为

c# - 如何在 WinForms 客户端应用程序中使用命令模式?

c# - 在 WPF 中,如何在控件模板中获取命令以绑定(bind)到父项中的属性?

c# - MEF导入解析

.net - 为什么三个线程比 10+ 快

java - 调用匿名类的子类方法

c++ - 为什么 C 风格的转换行为与 dynamic_cast 不同?