2010-06-29 2 views
0

Je cherche une méthode pour ajouter des mots-clés personnalisés au framework .net qui offrent des avantages pré-compliants "spéciaux" ou sont ignorés par le compilateur .Ajout de mots-clés personnalisés à .net à traiter par un processus de construction pré ou post

Exemple Je voudrais faire quelque chose comme ça

public static factory class Foo<T> 
{ 
    public static create T Create(); 
} 

Je voudrais ajouter un événement pré-compilation qui se traduit par ce code dans le fonctionnement C#. J'ai déjà envisagé quelques options (que je ne peux pas poster ici car je suis limité à 1 hyperlien) aucun d'entre eux ne fait exactement ce que je cherche à faire. Est-ce que quelqu'un d'autre a des suggestions?

+1

Qu'essayez-vous d'accomplir? Quelle sera la signification de ces mots-clés supplémentaires? – driis

+0

Il semble que mon exemple ne puisse pas illustrer toutes les situations où cela serait utilisé. Voici un autre exemple lorsque vous travaillez avec le modèle de décorateur Je voudrais pouvoir avoir cette syntaxe public décorateur classe Foo2: IFoo implémenteur Foo1 { public void Bar() {Do Stuff; }} un autre exemple de ce serait classe décorateur du public foo2: IFoo { foo2 public (IFoo foo): implementor foo Bar public void() {Do Stuff; } } Dans tous ces exemples, toutes les méthodes à l'exception de la barre seraient routées vers le constructeur IFoo comme transmis par un framework DI ou une référence interne Foo1 – George

Répondre

1

Cela ne peut être fait avec la version actuelle C#, à moins que vous êtes prêt à:

  • Créer votre propre compilateur C#
  • Créez votre propre préprocesseur à exécuter avant le compilateur réel.
+0

/agree, vous pourriez être en mesure de vous rapprocher de templating - suggérer de regarder dans T4 moteur peut-être. –

+0

vous mentionnez "reprocessor à exécuter avant le compilateur réel" Je ne trouve pas de moyen de le faire où je conserve le fichier cs d'origine. L'événement du préprocesseur était ma première pensée. Si vous avez un article ou une suggestion sur la façon dont je peux modifier le fichier cs seulement pour le compilateur et non le fichier original qui serait parfait. Merci pour votre réponse – George

1

Je propose quelque chose comme ceci:

[Factory()] 
public static class Foo<T> 
{ 
    [Create()] 
    public static T Create(); 
} 

Vous pouvez créer vos propres attributs et devrait être en mesure de les utiliser pour accomplir ce que vous avez besoin.

+0

Ceci est une bonne suggestion mais nécessite une implémentation. La grande chose que j'essayais de faire, c'est le décorateur décorateur par deligation. Par exemple si vous avez une interface qui a 40 méthodes mais que vous voulez seulement changer une méthode, en utilisant un mot-clé personnalisé je pourrais remplir toutes les autres implémentations de la méthode. Je suis en train de faire quelque chose comme ça dans le code maintenant avec des attributs mais il faut que la classe soit abstraite puis j'émets le code à l'exécution pour l'étendre à la classe. J'ai alors une usine pour obtenir la version étendue. Je préférerais simplement tout gérer au moment de la compilation si possible. – George

0

Pourriez-vous vous contenter d'utiliser des annotations? Votre exemple suggère que vous pourriez, mais je me rends compte que cela pourrait être trompeur.

+0

Les annotations fonctionnent bien dans mon implémentation existante, mais nécessitent un grand prix au démarrage de l'application où j'utilise codedom pour créer un nouvel assemblage au démarrage. Je peux passer à un modèle de postsharpeur et modifier juste l'IL mais cela ne me donnera pas le support de temps de compilation que je voudrais quand il s'agit de sens du code. merci pour votre suggestion – George

Questions connexes