【问题标题】:Extension method - having to use this keyword?扩展方法 - 必须使用这个关键字?
【发布时间】:2011-04-07 18:51:20
【问题描述】:

我已向 ASP.NET System.Web.UI.Page 添加了一个扩展方法。 我的应用程序中的每个页面都继承自此类。

但是,我不能只访问扩展方法。我必须输入this.MyMethod(); 而不是只能使用MyMethod()。我认为this 的方法/属性本来就在默认范围内。我不明白什么?或者这是扩展方法的细微差别?

【问题讨论】:

    标签: c# asp.net extension-methods


    【解决方案1】:

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

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

    我相信您已经知道这一点,但只是澄清一下:如果 ExtensionMethod 是您当前所在范围的类的扩展方法,请输入:

    this.ExtensionMethod();
    

    ...等同于:

    SomeStaticClass.ExtensionMethod(this);
    

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

    当然,它们可以以不同的方式实现,以便编译器将扩​​展方法和类成员“引入”默认范围;他们只是选择不这样做。就个人而言,我喜欢这样;但我想这是一个主观问题。无论如何,如果您不喜欢输入this,那只是小麻烦,对吧?

    【讨论】:

    • 正是...因为定义扩展方法的类是静态的,所以你永远不能拥有它的实例,因此在方法体中使用 this 是无效的。
    • @Paul:我认为这不是 OP 所要求的。我相信他想知道为什么,如果他在T 类型的代码中并且他在T 上有一个扩展方法,他必须在T 的代码中键入this.MyMethod() 而不是只是MyMethod()
    • 再次阅读这个问题两次你是绝对正确的...... :) 并不是说​​我的评论是错误的,它只是与这个确切的问题无关。跨度>
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      并且不要忘记包含扩展方法的类应该是静态的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-03
        • 2011-03-02
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        • 2011-05-02
        相关资源
        最近更新 更多