12
votes

Monkey patching in c #

est-il possible d'étendre ou de modifier le code d'une classe C # au moment de l'exécution?

Ma question s'articule spécifiquement autour de la programmation de patching / canard de singe ou de la programmation d'objets Meta (MOP), car elle se produit dans des langages de script tels que Groovy, Ruby, etc.


3 commentaires

Vous pouvez toutefois aller par la route irruby (ou frères et sœurs) pour obtenir des fonctionnalités dynamiques en C #


Je sais que cette question est ancienne. Mais il devrait vraiment y avoir un lien vers Microsoft Fakes , comme je suppose Une partie de la raison de la raison des personnes de singe dans ces langues teste. Les MOQ valent également la peine de regarder.


Vous pouvez le faire avec un cadre AOP. Je travaille activement sur l'un d'eux ici: NCONCERN .NET Runtime AOP Framework Vous pouvez vérifier un échantillon dans ce post : échantillon de patchs de singe


4 Réponses :


8
votes

est-il possible d'étendre ou de modifier le code d'une classe C # au moment de l'exécution?

Non, il n'est pas possible de le faire dans .NET. Vous pouvez écrire des cours dérivés et des méthodes de remplacement (s'ils sont virtuels), mais vous ne peut pas modifier une classe existante. Imaginez simplement si ce que vous demandiez était possible: vous pouvez modifier le comportement de certaines classes système existantes telles que System.string.

Vous pouvez également consulter méthodes d'extension pour ajouter des fonctionnalités à une classe existante.


8 commentaires

Je suppose que c'est le genre de chose que Humblecoder recherche. par exemple. Ajout d'une méthode au type de chaîne Pour analyser un type personnalisé à partir d'une représentation de chaîne afin que vous puissiez faire var serialObject = "stb-2" .Tomysérien ()


@Gishu, oui, nous pourrions utiliser des méthodes d'extension pour ajouter des méthodes aux classes existantes, mais nous ne pouvons pas modifier les méthodes existantes.


. droit. Les méthodes d'extension peuvent fonctionner pour certains besoins. Cependant, l'ouverture d'une classe comme dans Ruby n'est toujours pas possible comme vous avez répondu - ce que l'OP semble être après.


Je souhaite ajouter des méthodes de manière dynamique car cela se fait dans Grails / Ruby Active Record.


AFAIK Il est possible de modifier des méthodes de classes au moment de l'exécution, sinon vous pouvez modifier des cours au moment de l'exécution, mais il a besoin d'une connaissance approfondie du CLR et de la modification des structures de mémoire au moment de l'exécution.


"Imaginez juste ce qui se passerait" - pas besoin d'imaginer. Python permet de cela, et bien que ce soit toujours un porte-porte et personne ne soit toujours vraiment heureux quand il devient nécessaire, c'est un outil extrêmement puissant pour travailler autour des problèmes du monde réel. L'idée que quelque chose ne devrait pas être autorisée car il y a une possibilité d'être mal utilisé n'est aucun moyen de concevoir une langue.


Sinkey Patching vous permet de se moquer de services comme des applications et des ressources cloud qui vous permettraient ensuite d'exécuter des tests d'unités significatifs contre votre code sans avoir à ajouter des cas spéciaux à votre code de production. Et ce n'est qu'un exemple de la manière dont le patch de singe est puissant et une bonne chose à avoir. Voir le Moto PYTONE PAMPY qui se moque de beaucoup de services AWS afin que vous puissiez tester votre code de distribution sans le polluer avec des contrat de contrôle de l'unité et des karchs.


@GLENNMAYNARD C'est exactement la façon dont vous concevez une langue si vous vous attendez à ce qu'il soit utilisé pour le code de longue durée maintenu par des dizaines de personnes différentes qui ne sauront pas sur toutes les bizarreries introduites par le monokatching



4
votes

Vous pouvez ajouter fonctionnalité, mais vous ne pouvez pas modifier ou supprimer la fonctionnalité.


4 commentaires

Comment c'est possible? Une illustration est appréciée?


Les méthodes d'extension vous permettent d'ajouter des méthodes aux objets (c'est la manière dont la fonction de fonction de LINQ est implémentée). Les plaques de liaison fournies contiennent toutes les informations dont vous avez besoin.


Les méthodes d'extension n'autorisent que l'occasion d'ajouter des fonctionnalités au moment de la compilation, pas au moment de l'exécution. Si vous allez ajouter des fonctionnalités au moment de l'exécution, vous devez travailler avec un objet qui dérive de DynamicObject.


Bonne prise. D'une manière ou d'une autre, j'ai pris juste sur cette partie "Time d'exécution".



4
votes

Vous pouvez étendre des cours en ajoutant des méthodes supplémentaires, mais vous ne pouvez pas les remplacer car les méthodes ajoutées ont toujours une priorité plus faible que celle existante.

Pour plus d'informations, check méthodes d'extension dans le guide de programmation C #.


0 commentaires

1
votes

Pour ceux qui tombent toujours sur cette question dans la présente question, il y a en effet une bibliothèque actuelle appelée Harmony qui permet relativement-simples permet de corriger de tels patchs de singe au moment de l'exécution. Son focus est sur le jeu vidéo Modding (en particulier des jeux construits avec unité), mais il n'y a pas beaucoup d'arrêt des gens de l'utiliser à l'extérieur de ce cas d'utilisation.

Copier l'exemple de leur Introduction , si vous avez une classe existante comme: xxx

alors harmonie peut le patcher comme: xxx

ici, nous avons un patch "préfixe" qui est inséré avant que la méthode d'origine ne fonctionne, ce qui nous permet de définir des variables dans la méthode, de définir des champs sur la classe de la méthode, ou même sauter la méthode d'origine entièrement. Nous avons également un patch "postfix" qui est inséré après la fonction de la méthode d'origine et peut manipuler des choses comme la valeur de retour.

Évidemment, ce n'est évidemment pas aussi gentil que les types de correction de singe que vous pouvez faire par exemple Ruby, et il y a Beaucoup de mises en garde qui pourraient empêcher son utilité en fonction de Votre cas d'utilisation, mais dans ces situations où vous avez vraiment besoin de modifier les méthodes, l'harmonie est une approche très éprouvée pour le faire.


0 commentaires