Können Erweiterungsmethoden auf die Klasse angewendet werden?
Erweitern Sie DateTime beispielsweise um eine Tomorrow () -Methode, die wie folgt aufgerufen werden kann:
DateTime.Tomorrow();
Ich weiß, dass ich verwenden kann
static DateTime Tomorrow(this Datetime value) { //... }
Oder
public static MyClass {
public static Tomorrow() { //... }
}
für ein ähnliches Ergebnis, aber wie kann ich DateTime erweitern, damit ich DateTime.Tomorrow aufrufen kann?
quelle
Verwenden Sie eine Erweiterungsmethode .
Ex:
Verwendung:
oder
quelle
DateTime.Tomorrow()
als Erweiterungsmethoden verwenden, die nur für INSTANZEN einer Klasse und einer Klassenstruktur funktionieren. Folgen Sie Andrews Antwort oder Shuggys Antwort , um eine statische Methode auf einer Klassenstruktur zu "erweitern" .Erweiterungsmethoden sind syntaktischer Zucker, um statische Methoden, deren erster Parameter eine Instanz vom Typ T ist, so aussehen zu lassen, als wären sie eine Instanzmethode für T.
Als solches geht der Vorteil weitgehend verloren, wenn Sie "statische Erweiterungsmethoden" erstellen, da diese dazu dienen würden, den Leser des Codes noch mehr zu verwirren als eine Erweiterungsmethode (da sie vollständig qualifiziert zu sein scheinen, aber in dieser Klasse nicht definiert sind). für keinen syntaktischen Gewinn (z. B. in der Lage, Anrufe in Linq fließend zu verketten).
Da Sie die Erweiterungen ohnehin mit einer Verwendung in den Geltungsbereich bringen müssten, würde ich argumentieren, dass das Erstellen einfacher und sicherer ist:
Und dann verwenden Sie dies in Ihrem Code über:
quelle
Die Antwort kann ich am ehesten erreichen, indem ich einem
System.Type
Objekt eine Erweiterungsmethode hinzufüge . Nicht schön, aber trotzdem interessant.Ansonsten haben IMO Andrew und ShuggyCoUk eine bessere Implementierung.
quelle
Type
kann durch jeden anderen erforderlichen Typ ersetzt werden. Ich benutze es mitFrom
und es funktioniert perfekt. Ich denke, diese Antwort ist allgemein, aber richtigIch würde das gleiche tun wie Kumu
aber nenne es wie dieses neue DateTime (). Tomorrow ();
Denke, es macht mehr Seens als DateTime.Now.Tomorrow ();
quelle
Sie bieten die Möglichkeit, vorhandene Typen zu erweitern, indem neue Methoden hinzugefügt werden, ohne dass Änderungen am Typ erforderlich sind. Das Aufrufen von Methoden von Objekten des erweiterten Typs innerhalb einer Anwendung unter Verwendung der Instanzmethodensyntax wird als "Erweitern" -Methoden bezeichnet. Erweiterungsmethoden sind keine Instanzmitglieder des Typs. Der wichtigste Punkt, den Sie beachten sollten, ist, dass Erweiterungsmethoden, die als statische Methoden definiert sind, nur dann im Geltungsbereich liegen, wenn der Namespace über die using-Direktive explizit in Ihren Anwendungsquellcode importiert wird. Obwohl Erweiterungsmethoden als statische Methoden definiert sind, werden sie dennoch mithilfe der Instanzsyntax aufgerufen.
Das vollständige Beispiel finden Sie hier http://www.dotnetreaders.com/articles/Extension_methods_in_C-sharp.net,Methods_in_C_-sharp/201
Beispiel:
quelle
Ich suchte nach etwas Ähnlichem - einer Liste von Einschränkungen für Klassen, die Erweiterungsmethoden bereitstellen. Es scheint schwierig zu sein, eine präzise Liste zu finden.
Sie können nichts Privates oder Geschütztes haben - Felder, Methoden usw.
Es muss eine statische Klasse sein, wie in
public static class...
.Es können nur Methoden in der Klasse sein, und sie müssen alle öffentlich statisch sein.
Sie können keine herkömmlichen statischen Methoden verwenden - solche, die dieses Argument nicht enthalten, sind nicht zulässig.
Alle Methoden müssen beginnen:
public static ReturnType MethodName (dieser Klassenname _this, ...)
Das erste Argument ist also immer diese Referenz.
Dies führt zu einem impliziten Problem: Wenn Sie Methoden hinzufügen, für die eine Sperre erforderlich ist, können Sie diese nicht wirklich auf Klassenebene bereitstellen. Normalerweise stellen Sie eine Sperre auf privater Instanzebene bereit, aber es ist nicht möglich, private Felder hinzuzufügen, sodass Sie einige sehr umständliche Optionen haben, z. B. die Bereitstellung als öffentliche Statik für eine externe Klasse usw. Wird schwierig. Zeichen die C # -Sprache hatte, hatten eine schlechte Wendung im Design für diese .
Die Problemumgehung besteht darin, Ihre Erweiterungsmethodenklasse nur als Fassade für eine reguläre Klasse zu verwenden, und alle statischen Methoden in Ihrer Erweiterungsklasse rufen nur die reale Klasse auf, wahrscheinlich unter Verwendung eines Singleton .
quelle
Das kannst du leider nicht. Ich glaube jedoch, dass es nützlich wäre. Es ist natürlicher zu tippen:
als:
Bei einer Util-Klasse müssen Sie überprüfen, ob eine statische Methode in zwei verschiedenen Klassen statt in einer vorhanden ist.
quelle
Wir haben unsere Antwort mit detaillierten Erklärungen verbessert. Jetzt ist die Erweiterungsmethode leichter zu verstehen
Erweiterungsmethode : Dies ist ein Mechanismus, mit dem wir das Verhalten vorhandener Klassen erweitern können, ohne die Unterklassifizierung zu verwenden oder die ursprüngliche Klasse oder Struktur zu ändern oder neu zu kompilieren.
Wir können unsere benutzerdefinierten Klassen, .net Framework-Klassen usw. erweitern.
Die Erweiterungsmethode ist eine spezielle statische Methode, die in der statischen Klasse definiert ist.
Da die
DateTime
Klasse bereits oben belegt ist und wir diese Klasse daher nicht zur Erklärung herangezogen haben.Unten ist das Beispiel
// Dies ist eine vorhandene Calculator-Klasse mit nur einer Methode (Add)
quelle