Est-il possible d'ajouter une méthode à une classe EXISTANTE au moment de l'exécution? pourquoi ou pourquoi pas?
J'imagine que cela peut utiliser la Réflexion.Émettre,
mais une question similaire sur DONC seules réponses comment créer une classe/méthode de façon dynamique, pas comment mettre à jour une classe existante.
Dans un même ordre d'idées, est-il possible de supprimer méthodes /classes au moment de l'exécution? Si oui, je suppose qu'on pourrait juste supprimer la classe, et l'ajouter avec ses vieilles méthodes plus le nouveau.
Merci d'avance.
P. S. je n'ai pas l'intention d'utiliser pour cela, c'est simplement une question de curiosité.
- C'est un parfait exemple de pourquoi tant de questions doit contenir uniquement une question par post. Marc et Henk chaque répondu à une question distincte vous avez demandé, et les deux sont bons, les réponses correctes. Laquelle allez-vous choisir comme le droit l'un et l'accepter? Veuillez vous limiter à un unique question par post pour éviter cette situation, où l'un des intervenants est récompensée et l'autre ne l'est pas, même si les deux réponses sont bonnes, de rectification, et de répondre à votre question.
- Ok. Je vais essayer de rappeler que, dans l'avenir. le but unique principe pour les questions à la place des méthodes, des objets. Maintenant que l'acte a été fait, cependant, je probablement ne devrait pas changer.
Vous devez vous connecter pour publier un commentaire.
Régulièrement en C# /.NET, la réponse est un simple "non". Le plus vous pouvez faire est d'écrire un
DynamicMethod
qui peut se comporter comme une méthode de ce type (l'accès aux champs privés, etc), mais il ne sera jamais sur l'API - vous juste à la fin avec un délégué.Si vous utilisez
dynamic
, vous pouvez faire à peu près tout ce que vous voulez. Vous pouvez reproduire avecExpandoObject
en attachant délégués en place de méthodes, mais sur une dynamique personnalisé de type que vous pouvez faire presque n'importe quoi - mais cela concerne uniquement les appelants qui utilisent ledynamic
API. Pour une baseExpandoObject
exemple:Pour les propriétés et les événements (pas de méthodes), vous pouvez utiliser le
System.ComponentModel
approche modifier ce qui apparaît au moment de l'exécution, mais qui ne touche que les appelants qui accèdent viaSystem.ComponentModel
, ce qui signifie essentiellement: les données de l'INTERFACE de liaison. C'est de cette façonDataTable
représente les colonnes pseudo-propriétés (en oubliant "typés" pour le moment, il fonctionne sans ceux-ci).Pour être complet, je dois aussi mentionner les méthodes d'extension. Ceux-ci sont plus un compilateur truc, pas un runtime truc - mais un peu vous permettent d'ajouter des méthodes à un type existant - pour de petites valeurs de "ajouter".
Un dernier truc, couramment utilisés par les Orm etc - est dynamiquement sous-classe le type, et de fournir des fonctionnalités supplémentaires dans la sous-classe. Par exemple, en remplaçant les propriétés afin de les intercepter (lazy-loading, etc).
Suppose que c'était possible. Les appels à ces méthodes échouent et produire de l'indéfini (mais le plus souvent catastrophique) de comportement.
Donc, je suis sûr qu'il n'est pas possible.
MissingMethodException
etTypeLoadException
. Ils peuvent se produire lorsque vous générez votre code par rapport à une version d'une assemblée, mais ensuite l'exécuter sur une autre version, qui est absent de la méthode ou le type.