接口上的扩展方法

时间:2009-12-26 18:03:31

标签: c# inheritance extension-methods

我有两个接口IDto1和IDto2。 IDto2继承IDto1。这两个接口都是针对DTO的,因此我希望将“复杂”代码保留在其实现之外 - 我通过在每个接口的静态类中放置一个扩展方法 Initialize 来实现这一点。

所以我最终得到以下类型IDto1,IDto2,IDto1Extensions,IDto2Extensions。

我希望在两个接口上都有 Initialize 扩展方法,但每个接口都有不同的实现。

在客户端代码中,我想使用这样的代码:

(dto as IDto1).Initialize();

...我希望在运行时根据dto变量的已解析类型调用相关的扩展方法。

这可能在C#中,如果不是,为什么不呢?

修改

很抱歉,当然:

(dto as IDto1).Initialize();

...将在 IDto1 类型上调用 Initialize 方法。我的意思是 dto 变量将作为参数传递给方法,在这种情况下,我相信在给定我之前指定的继承层次结构的情况下,将多态地选择该方法。

感谢您的所有答案。

5 个答案:

答案 0 :(得分:4)

你在这里想要实现的是某种多态性。扩展方法是静态方法。在OOP中,polymorphysm仅适用于实例方法。

一个选项可能是切换到抽象类。

答案 1 :(得分:4)

看看你的陈述:

(dto as IDto1).Initialize();
     

...我希望在运行时根据dto变量的已解析类型调用相关的扩展方法。

括号中的“已解析类型”正好 IDto1。它不能是其他任何东西,所以编译器将使用它。实际上变量永远不会改变类型(我假设你的意思是对象由变量的值引用)。

在.NET 4.0 / C#4.0中,鸭子类型的选项可能是实例方法而且dynamic ...

((dynamic)dto).Initialize();

...但说实话,我不明白为什么你不能只是将你的Initialize方法添加到界面并使用多态,因为这听起来最接近你想要描述的内容。 / p>

答案 2 :(得分:3)

您要完成的任务是不可能的,因为扩展方法在编译时被解析,而在您的情况下,dto变量的实际类型仅在运行时才知道。

答案 3 :(得分:1)

如果你想让你的代码更动态,你可以在配置文件中定义你想要的类,并使用类似的东西

String className = ConfigurationManager.AppSettings["Interface"].ToString();

IDto1 dto = (IDto1)Activator.CreateInstance(Type.GetType(className));

在这个示例中,我使用第一行来获取类名。

第二行创建Object的实例。

Guilherme Ferreira http://guilhermeferreira.wordpress.com/

答案 4 :(得分:0)

这听起来像是抽象基类的工作。