【发布时间】:2011-04-07 18:51:20
【问题描述】:
我已向 ASP.NET System.Web.UI.Page 添加了一个扩展方法。 我的应用程序中的每个页面都继承自此类。
但是,我不能只访问扩展方法。我必须输入this.MyMethod(); 而不是只能使用MyMethod()。我认为this 的方法/属性本来就在默认范围内。我不明白什么?或者这是扩展方法的细微差别?
【问题讨论】:
标签: c# asp.net extension-methods
我已向 ASP.NET System.Web.UI.Page 添加了一个扩展方法。 我的应用程序中的每个页面都继承自此类。
但是,我不能只访问扩展方法。我必须输入this.MyMethod(); 而不是只能使用MyMethod()。我认为this 的方法/属性本来就在默认范围内。我不明白什么?或者这是扩展方法的细微差别?
【问题讨论】:
标签: c# asp.net extension-methods
我认为方法/属性 这本来就是默认的 范围。
他们是。但是扩展方法不是默认范围内this的方法;它们是静态方法,可通过编译器提供的语法糖访问。
我相信您已经知道这一点,但只是澄清一下:如果 ExtensionMethod 是您当前所在范围的类的扩展方法,请输入:
this.ExtensionMethod();
...等同于:
SomeStaticClass.ExtensionMethod(this);
this 需要作为 参数 传递给ExtensionMethod。上面的第一种方式,编译器只是为你做这件事。
当然,它们可以以不同的方式实现,以便编译器将扩展方法和类成员“引入”默认范围;他们只是选择不这样做。就个人而言,我喜欢这样;但我想这是一个主观问题。无论如何,如果您不喜欢输入this,那只是小麻烦,对吧?
【讨论】:
T 类型的代码中并且他在T 上有一个扩展方法,他必须在T 的代码中键入this.MyMethod() 而不是只是MyMethod()。
这是扩展方法的细微差别吗?
是的,是的。 (正如其他人所解释的那样。)
如果您想在没有任何限制的情况下使用该方法,那么您可以创建一个从 Page 继承并包含您的方法的类(当然,减去第一个参数)。然后让应用程序中的每个页面都继承自新的自定义页面。
【讨论】:
为了使用扩展方法,你应该声明:
using Namespace.Where.Extension.Method.Is.Located
并且不要忘记包含扩展方法的类应该是静态的。
【讨论】: