2009-06-09 8 views
6

Ich bin mir sicher, dass die Antwort etwas offensichtliches ist, und es ist mir peinlich, dass ich die Antwort nicht wirklich kenne, aber bedenke das folgende Codebeispiel, das ich beim Lesen von "Professional ASP.NET MVC 1.0" gelesen habe:Was bedeutet "dieses", wenn es als Präfix für Methodenparameter verwendet wird?

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); 
    } 
} 

ich verstehe, was diese statische Methode tut, aber was ich nicht verstehe, ist, welchen Zweck das Wort „this“ in der Methodensignatur dient. Kann mich jemand aufklären?

Antwort

17

Das ist ein neues C# 3.0 Feature namens extension method.

Dies bedeutet, dass Sie Ihren ModelStateDictionary-Objekten eine neue Methode hinzufügen. Sie können es wie eine normale Methode aufrufen:

yourModelStateDictionary.AddRuleViolations(errors); 

See, dass der erste Parameter (die ‚this'-Parameter) übersprungen. Es weist nur ModelStateDictionary als gültiges Ziel für Ihre Erweiterungsmethode zu.

Der Hinweis ist, dass Sie dies mit jeder Klasse - sogar versiegelten oder 3rd-Party-Klassen, wie .NET-Framework-Klassen (zum Beispiel auf Objekt oder String) tun können.

+0

Konnte es besser nicht selbst gesagt haben – TWith2Sugars

1

Es bedeutet, dass die betreffende Methode eine "Erweiterungsmethode" ist und aufgerufen werden kann, als ob es eine Methode der Klasse selbst wäre. Siehe hierzu article.

1

Es ist eine Erweiterung Methodensignatur, Es bedeutet, die „AddRuleViolations“ wird als Erweiterung Methode der Modelstate behandelt werden.

Von MSDN.

Erweiterungsmethoden ermöglichen es Ihnen, einen neuen abgeleiteten Typ zu schaffen, Neukompilierung, Methoden vorhandenen Typenohne „add“ oder auf andere Weise die ursprüngliche Art zu modifizieren. Die Erweiterungsmethoden sind eine spezielle Art der statischen Methode, , aber sie werden aufgerufen, als ob sie Instanzmethoden auf dem erweiterten Typ wären. Für Client-Code geschrieben in C# und Visual Basic, gibt es keinen offensichtlichen Unterschied zwischen Aufruf einer Erweiterungs-Methode und die Methoden, die tatsächlich in einem Typ definiert sind.