我正在尝试扩展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/