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

我的方法称为SetQuery
如果我在Page类中键入SetQuery,则无法识别(是的,我已经添加了using [Namespace];),
如果我键入base.SetQuery,它会在IntelliSense中看到,但不会编译为实际上在Page中找不到任何方法或扩展方法,
如果我键入(this as Page).SetQuery,它将被识别并起作用。

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

在没有强制类型转换的情况下,有没有一种“更自然”的方式来键入SetQuery?

最佳答案

扩展方法始终需要一个(显式)目标对象,因此无法仅通过TheMethodName()调用扩展方法。我怀疑如果您键入:

this.SetQuery();

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

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

关于c# - 继承的奇怪扩展方法问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6888586/

10-13 07:31