我已经将扩展方法添加到ASP.NET System.Web.UI.Page。 我的应用程序中的每一页都从这个类继承。扩展方法 - 必须使用这个关键字吗?
但是,我不能只访问扩展方法。我必须输入this.MyMethod();
,而不是只能使用MyMethod()
。我认为this
的方法/属性本质上属于默认范围。我不了解什么?或者这是一种扩展方法的细微差别?
我已经将扩展方法添加到ASP.NET System.Web.UI.Page。 我的应用程序中的每一页都从这个类继承。扩展方法 - 必须使用这个关键字吗?
但是,我不能只访问扩展方法。我必须输入this.MyMethod();
,而不是只能使用MyMethod()
。我认为this
的方法/属性本质上属于默认范围。我不了解什么?或者这是一种扩展方法的细微差别?
我以为 的方法/属性本身就是默认的 范围。
他们是。但扩展方法是不是方法this
在默认范围内;它们是通过编译器提供的语法糖来访问的静态方法。
我相信你已经知道这一点,但我只想澄清:如果ExtensionMethod
是其范围目前在你的类的扩展方法,键入此:
this.ExtensionMethod();
...是一样的:
SomeStaticClass.ExtensionMethod(this);
this
需要作为参数到ExtensionMethod
传递。上面的第一种方式,编译器只是为你做这个。
当然,他们可能已经实现了不同的东西,以便编译器将“引入”扩展方法以及类成员放入默认范围;他们只是简单地选择不去。我个人喜欢那样;但我想这是一个主观的问题。无论如何,如果你不喜欢输入this
,这只是一个小小的烦恼,对吧?
为了使用扩展方法,你应该声明:
using Namespace.Where.Extension.Method.Is.Located
而且不要忘了类,用于保存扩展方法应该是静态的。
这是一个扩展方法的细微差别吗?
是的。 (正如其他人所解释的那样)。
如果你想使用没有任何限定的方法,那么你可以创建一个从Page继承的类并包含你的方法(当然不包括第一个参数)。然后让您的应用程序中的每个页面都从您的新自定义页面继承。
......因为定义扩展方法的类是静态的,所以永远不能拥有它的实例,因此在方法体中它的使用是无效的。 – 2011-04-07 18:56:27
@保罗:我不认为这是OP的要求。我相信他想知道为什么,如果他在'T'类型的代码中,并且他在'T'上有一个扩展方法,他必须在'T' *代码中键入'this.MyMethod()'*,而不仅仅是'的MyMethod()'。 – 2011-04-07 18:59:28
*再次阅读这个问题两次*你是绝对正确的... :)不是说我的评论是错误的,无论如何它只是与这个确切的问题无关。 – 2011-04-07 23:44:19