奇怪的扩展方法与继承问题

时间:2011-07-31 09:23:38

标签: c# asp.net inheritance extension-methods

我正在尝试扩展Page类以在ASP.NET中添加一些新功能(一些方法的易用性,因为它们将在该页面的代码中直接调用),并且我得到一个奇怪的错误:

我的方法叫做SetQuery
如果我在Page类中键入SetQuery,则无法识别(是的,我添加了using [Namespace];),
如果我输入base.SetQuery,则会在IntelliSense中看到它,但是没有编译说在页面中实际找不到任何方法或扩展方法,
如果我输入(this as Page).SetQuery,它就会被识别并有效。

特别是第二种情况对我来说似乎是一个错误,因为IntelliSense将其识别为扩展方法,但没有编译。

有没有'更自然'的方式可以随意输入SetQuery,没有强制转换等等?

1 个答案:

答案 0 :(得分:9)

扩展方法总是需要(显式)目标对象,因此不可能仅通过TheMethodName()调用扩展方法。我怀疑如果你输入:

this.SetQuery();

它会起作用。 从不 是带有扩展方法的隐式this.。奇怪但真实。

以上解释了为什么SetQuery()不起作用; base.SetQuery()将不起作用,因为扩展方法是为Page定义的,而不是为基类定义的。 (this as Page).SetQuery()的工作原因与this.SetQuery()相同,实际上this as Page显然是正确的,编译器会将其视为无操作 - 即this.SetQuery()和{{ 1}}应该生成相同的IL(只要实际页面没有更具体的(this as Page).SetQuery()方法,显然)。