2011-04-07 50 views
1

我已经将扩展方法添加到ASP.NET System.Web.UI.Page。 我的应用程序中的每一页都从这个类继承。扩展方法 - 必须使用这个关键字吗?

但是,我不能只访问扩展方法。我必须输入this.MyMethod();,而不是只能使用MyMethod()。我认为this的方法/属性本质上属于默认范围。我不了解什么?或者这是一种扩展方法的细微差别?

回答

5

我以为 的方法/属性本身就是默认的 范围。

他们是。但扩展方法是不是方法this在默认范围内;它们是通过编译器提供的语法糖来访问的静态方法。

我相信你已经知道这一点,但我只想澄清:如果ExtensionMethod是其范围目前在你的类的扩展方法,键入此:

this.ExtensionMethod(); 

...是一样的:

SomeStaticClass.ExtensionMethod(this); 

this需要作为参数ExtensionMethod传递。上面的第一种方式,编译器只是为你做这个。

当然,他们可能已经实现了不同的东西,以便编译器将“引入”扩展方法以及类成员放入默认范围;他们只是简单地选择不去。我个人喜欢那样;但我想这是一个主观的问题。无论如何,如果你不喜欢输入this,这只是一个小小的烦恼,对吧?

+0

......因为定义扩展方法的类是静态的,所以永远不能拥有它的实例,因此在方法体中它的使用是无效的。 – 2011-04-07 18:56:27

+1

@保罗:我不认为这是OP的要求。我相信他想知道为什么,如果他在'T'类型的代码中,并且他在'T'上有一个扩展方法,他必须在'T' *代码中键入'this.MyMethod()'*,而不仅仅是'的MyMethod()'。 – 2011-04-07 18:59:28

+0

*再次阅读这个问题两次*你是绝对正确的... :)不是说我的评论是错误的,无论如何它只是与这个确切的问题无关。 – 2011-04-07 23:44:19

0

为了使用扩展方法,你应该声明:

using Namespace.Where.Extension.Method.Is.Located 

而且不要忘了类,用于保存扩展方法应该是静态的。

2

这是一个扩展方法的细微差别吗?

是的。 (正如其他人所解释的那样)。

如果你想使用没有任何限定的方法,那么你可以创建一个从Page继承的类并包含你的方法(当然不包括第一个参数)。然后让您的应用程序中的每个页面都从您的新自定义页面继承。