我正在尝试扩展Page类以在ASP.NET中添加一些新功能(一些方法的易用性,因为它们将在该页面的代码中直接调用),并且我得到一个奇怪的错误:
我的方法叫做SetQuery
,
如果我在Page类中键入SetQuery
,则无法识别(是的,我添加了using [Namespace];
),
如果我输入base.SetQuery
,则会在IntelliSense中看到它,但是没有编译说在页面中实际找不到任何方法或扩展方法,
如果我输入(this as Page).SetQuery
,它就会被识别并有效。
特别是第二种情况对我来说似乎是一个错误,因为IntelliSense将其识别为扩展方法,但没有编译。
有没有'更自然'的方式可以随意输入SetQuery,没有强制转换等等?
答案 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()
方法,显然)。