2009-06-09 11 views
6

私は答えが何か明白であると確信しています。私は実際に答えが分かりませんが、 "Professional ASP.NET MVC 1.0"を読んでいるときにピックアップした次のコードサンプルを考慮すると恥ずかしいです。メソッドパラメータの接頭辞として使用する場合、「this」は何を意味しますか?

public static class ControllerHelpers 
{ 
    public static void AddRuleViolations(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors) 
    { 
     foreach (RuleViolation issue in errors) 
      modelState.AddModelError(issue.PropertyName, issue.ErrorMessage); 
    } 
} 

私はこの静的メソッドが何をしているかを理解し、しかし、私は理解していないと、単語「この」メソッドのシグネチャで提供しているどのような目的です。誰でも私を啓発することはできますか?

答えて

17

これはextension methodという新しいC#3.0機能です。

つまり、ModelStateDictionaryオブジェクトに新しいメソッドを追加するということです。

yourModelStateDictionary.AddRuleViolations(errors); 

「最初のパラメータ(this'-parameter)はスキップされます」を参照してください。 ModelStateDictionaryを拡張メソッドの有効なターゲットとして割り当てます。

手がかりは、.NETフレームワーククラス(オブジェクトや文字列など)のように、あらゆるクラス、つまり密封されたクラスやサードパーティのクラスでも可能です。

+0

私の自己をより良くすることはできませんでした – TWith2Sugars

1

これは、問題のメソッドが「拡張メソッド」であり、クラス自体のメソッドであるかのように呼び出すことができることを意味します。これはarticleを参照してください。

1

それは「AddRuleViolations」ModelStateDictionaryの拡張子の方法として扱われることを意味する、拡張子メソッドシグネチャです。

よりMSDNから。

拡張メソッドは、新しい派生型、 再コンパイルを作成し、またはそうでなければ 元の型を変更する なし既存のタイプに 方法を「追加」することができます。拡張メソッド は特殊な種類の静的メソッドで、 ですが、それらは拡張型の インスタンスメソッドであるかのように呼び出されます。 C#および Visual Basicで記述されたクライアントコードの場合、 拡張メソッドの呼び出しと、 が実際に型で定義されているメソッドの間には、明らかな違いはありません( )。

関連する問題