Ist es möglich, fügen Sie eine Methode zu einer BESTEHENDEN Klasse zur Laufzeit? warum oder warum nicht?
Ich könnte mir vorstellen, dies könnte mithilfe von Reflektion.Emittieren,
aber eine ähnliche Frage auf SO nur Antworten, wie das erstellen einer Klasse/Methode dynamisch, nicht, wie das update einer vorhandenen Klasse.
In eine ähnliche Richtung, ist es möglich, löschen von Methoden /Klassen zur Laufzeit? Wenn dem so ist, ich vermute, man könnte einfach löschen, die Klasse, und fügen Sie es wieder mit seinen alten Methoden plus die neuen.
Vielen Dank im Voraus.
P. S. ich habe keinen Verwendungszweck für diese, ist es nur eine Frage der Neugier.
- Dies ist ein perfektes Beispiel dafür, warum SO Fragen enthalten sollte nur eine Frage pro post. Marc und Henk jeder beantwortet eine separate Frage, die Sie gefragt, und beide sind gute, richtige Antworten. Welche Sie wählen, wie Sie die richtige ein und akzeptieren? Bitte beschränken Sie sich auf eine single Frage pro post um diese situation zu vermeiden, wo einer der Responder wird belohnt und der andere nicht, obwohl beide Antworten sind gut, richtig, und die Antwort auf Ihre Frage.
- Ok. Ich werde versuchen, daran zu erinnern, dass in der Zukunft. der single-purpose-Prinzip für Fragen, anstatt von Methoden/Objekte. Nun, da die Tat getan wurde, obwohl, ich sollte das wohl nicht ändern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In regelmäßigen C# /.NET, die Antwort ist ein klares "Nein". Die meisten Sie tun können, ist schreiben eine
DynamicMethod
können Verhalten wie eine Methode von diesem Typ (Zugriff auf private Felder etc), aber es wird nicht immer auf die API - Sie am Ende nur mit einem Delegierten.Wenn Sie
dynamic
können Sie so ziemlich alles, was Sie wollen. Sie emulieren kann, die mitExpandoObject
durch das anbringen Delegierten an Stelle von Methoden, sondern auf eine benutzerdefinierte dynamische Art, die Sie tun können, fast alles - aber das wirkt sich nur auf die Anrufer, die diedynamic
API. Für eine grundlegendeExpandoObject
Beispiel:Für Eigenschaften und Ereignisse (nicht die Methoden), können Sie die
System.ComponentModel
Ansatz zu ändern, was zur Laufzeit erscheint, aber das wirkt sich nur auf die Anrufer erhalten Zugang überSystem.ComponentModel
, das heißt vor allem: UI Datenbindung. Dies ist, wieDataTable
darstellt Spalten als pseudo-Eigenschaften (vergessen über die "typisierte datasets" für den moment - es funktioniert auch ohne diese).Vollständigkeit halber sollte ich auch erwähnen Erweiterung Methoden. Diese sind eher ein compiler-trick, nicht einen Laufzeit-trick - aber irgendwie ermöglicht das hinzufügen von Methoden zu einem bestehenden Typ - für kleine Werte von "add".
Einen letzten trick, Häufig von ORMs etc - ist dynamisch Unterklasse die Art und bieten zusätzliche Funktionalität in der Unterklasse. Zum Beispiel, überschreiben von Eigenschaften, um Sie aufzuhalten (lazy-loading, etc.).
Nehme an, dass es möglich war. Anrufe auf solche Methoden nicht und würde produzieren undefiniert (aber in der Regel katastrophal) Verhalten.
So, ich bin sicher, es ist nicht möglich.
MissingMethodException
undTypeLoadException
. Sie kann passieren, wenn Sie bauen Sie Ihren code gegen eine version einer Baugruppe, sondern führen Sie es gegen eine andere version, die fehlt, ist die Methode oder der Typ.