为什么`w(“hi”)`不起作用但是`this.w(“hi”)`工作?

时间:2012-08-31 12:37:44

标签: c# c#-4.0 razor

  

可能重复:
  Why is the 'this' keyword required to call an extension method from within the extended class

我想要本地化我的MVC应用程序,然后我想使用w(message)方法和as “flem”回答here我有这段代码:

namespace System.Web.WebPages
{
    public static class Localization
    {
        public static string w(this WebPageBase page, string message)
        {
            return message;
        }
    }
}

但是在剃刀页面(page.cshtml)中,我无法使用@w("hi")@this.w("hi")无效。 我想知道this.method()如何工作,但method()不起作用?

3 个答案:

答案 0 :(得分:2)

要调用静态方法,您必须指定方法所属的类。

在您的情况下,因为这是一种扩展方法,this指的是WebPageBase类型的当前页面。所以this.w("hi")实际上和你写的一样:

@WebPageBase.w("hi")

......相当于:

@Localization.w(this, "hi")

答案 1 :(得分:2)

w是一种扩展方法,它们的工作方式是您调用它的对象代替方法签名中this指定的参数。

this.w的情况下,您正在指定它所处理的对象。

如果你jsut调用w(""),那么你没有指定第一个参数。

我假设您正在考虑如果它是该对象的方法,则两个调用将是相同的,这是真的。但是,区别在于范围内没有只有w的方法。该方法在另一个类中,它只是扩展方法的神奇之处,它允许它在正确的环境中工作。

答案 2 :(得分:1)

您已为WebPageBase创建了一个扩展方法 应该使用对象WebPageBase或派生对象来调用它 在您的情况下,this是要使用的正确对象(可能是页面对象)

http://msdn.microsoft.com/en-us/library/bb383977.aspx