10
votes

Comment injecter / générer du code de plomberie dans des méthodes décorées avec un attribut?

Je lisais des articles sur la mise en cache et la mémoire de mémoisation et sur la manière de la mettre en œuvre facilement en utilisant des délégués et des génériques. La syntaxe était assez simple et il est étonnamment facile à mettre en œuvre, mais je me sens juste en raison de la nature répétitive qu'il devrait être possible de générer du code basé sur un attribut, au lieu de devoir écrire le même code de plomberie sur et plus.

Disons que nous commençons par l'exemple par défaut: xxx

et ensuite pour mémoiser ceci: xxx p> Je pensais, Ne serait-il pas plus simple de simplement effectuer un générateur de code qui crache ce code, une fois qu'il trouve une méthode marquée correspondant à l'une des méthodes de poste Memoize. Donc, à condition d'écrire ce code de plomberie, je pourrais simplement ajouter un attribut: xxx

honnêtement, je sais que cela ressemble plus à un sucre de compilateur qui devrait être converti par un préprocesseur que Génération de code réelle mais ma question est la suivante:

  1. Selon vous, quelle est la meilleure façon de trouver les méthodes dans un fichier source C # qui possède un attribut donné, analysant les paramètres et le retour de retour et générant un délégué qui correspond à cette empreinte digitale
  2. Quel serait le meilleur moyen d'intégrer cela dans le processus de construction, sans écraser réellement mon code. Est-il possible de faire du prétraitement sur les fichiers source avant de le transmettre au compilateur?

    merci pour toutes les idées et toutes les idées.

    update :

    J'ai examiné la bibliothèque posthars comme Shay avait suggéré, et Il semblait très adapté au travail sur des applications non critiques telles que la gestion des transactions, le traçage ou la sécurité.

    Cependant, lorsque vous l'utilisez dans un contexte critique, il s'est avéré beaucoup plus lentement que le délégué. Un million d'itérations de l'exemple Fibonacci avec chaque mise en œuvre ont entraîné une roulie de 80x ralentissement. (0.012ms postSharp vs 0.00015ms délégué par appel)

    Mais honnêtement, le résultat est totalement acceptable dans le contexte dans lequel j'ai l'intention de l'utiliser. Merci pour les réponses!

    update2 :

    Apparemment, l'auteur de postsharp fonctionne fort sur un La version 2.0 qui comprendra, entre autres choses, des améliorations de performance du code produit et de la compilation .


0 commentaires

4 Réponses :


3
votes

J'ai utilisé la fonction mémoire suivante dans un projet de mine: xxx

dans mon projet, je n'ai besoin que de fonctions avec un seul argument qui implémente Iequatable <ð ¢> Mais cela peut être généralisé encore plus loin. Une autre remarque importante est que ce code n'est pas un fil sûr. Si vous avez besoin de sécurité de thread, vous devez synchroniser l'accès en lecture / écriture à la carte interne Hashtable.


1 commentaires

Ce n'est pas ma question. Vérifiez les points de bullets en bas.



6
votes

2 commentaires

Cela ressemble à une très bonne alternative. Va regarder dans ça.


@Patrick, donc tu fais tout le travail difficile et je reçois les votes up :)



1
votes

Pour adresser spécifiquement vos points:

  1. Ce serait probablement trop difficile à faire dans la façon dont vous décrivez, comme Vous auriez besoin d'une grammaire c # soufflée analyseur. Qu'est-ce qui pourrait être un plus viable alternative écrit une application gérée qui pourrait charger le compilé Type d'assemblage et d'extrait informations à l'aide de la réflexion. Cette impliquerait d'obtenir tout type objets dans un assemblage donné, à la recherche Pour des méthodes sur les types, récupération l'attribut personnalisé, puis émettre le code de mémoisation (ce une partie pourrait être un peu difficile).
  2. Si vous allez l'itinéraire, je mentionne dans le n ° 1, vous pourriez simplement Ajoutez une étape post-construction pour exécuter votre outil. Visual Studio (qui utilise Msbuild en dessous) rend cela relativement facile.

0 commentaires

1
votes

Si vous écrivez un plugin à postSharp au lieu d'utiliser sa bibliothèque Laos, vous n'obtiendriez aucune performance.


0 commentaires