1

重複の可能性:
拡張クラス内から拡張メソッドを呼び出すために「this」キーワードが必要なのはなぜですか?

MVCアプリケーションをローカライズしたいのですが、メソッドを使用したいのですが、ここでw(message)「flem」が答えたので、次のコードがあります。

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()機能しませんか?

4

3 に答える 3

2

静的メソッドを呼び出すには、メソッドが属するクラスを指定する必要があります。

あなたの場合、これは拡張メソッドであるためthis、タイプの現在のページを参照していますWebPageBase。したがってthis.w("hi")、事実上、あなたが書いているのと同じです:

@WebPageBase.w("hi")

...これは次と同等です:

@Localization.w(this, "hi")
于 2012-08-31T12:41:32.587 に答える
2

wは拡張メソッドであり、それらが機能する方法は、それを呼び出すオブジェクトがthis、メソッド シグネチャで指定されたパラメータの代わりに配置されることです。

this.wオブジェクトを指定している場合は、動作する必要があります。

jsut 呼び出しの場合w("")、その最初のパラメーターを指定していません。

それがそのオブジェクトのメソッドである場合、2 つの呼び出しは同じであり、これは正しいと考えていると思います。ただし、違いは、スコープ内にただのメソッドがないことですw。そのメソッドは別のクラスにあり、適切な状況で機能することを可能にする拡張メソッドの唯一の魔法です。

于 2012-08-31T12:42:20.857 に答える
1

WebPageBase の拡張メソッドを作成しました。
オブジェクト WebPageBase または派生オブジェクトを使用して呼び出す必要があります。
あなたの場合this、使用する正しいオブジェクトです(おそらく Page オブジェクト)

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

于 2012-08-31T12:42:37.377 に答える