2010-01-29 10 views
5
internal List<CodeMemberMethod> createEventHooks() 
     { 
      string[] eventNames = new string[] { "OnUpdate", "OnInsert", "OnDelete", "OnSelect", "OnSelectAll" }; 
      List<CodeMemberMethod> eventHooks = new List<CodeMemberMethod>(); 

      foreach (string eventName in eventNames) 
      { 
       CodeMemberMethod eventHook = new CodeMemberMethod(); 
       eventHook.Name = eventName; 
       eventHook.Attributes = MemberAttributes.ScopeMask; 
       eventHook.ReturnType = new CodeTypeReference("partial void"); 
      } 
      return eventHooks; 
     } 

produit le code suivant:Comment ajouter une méthode partielle sans mise en œuvre à l'aide CodeDom

partial void OnUpdate() { 
} 

partial void OnInsert() { 
} 

partial void OnDelete() { 
} 

partial void OnSelect() { 
} 

partial void OnSelectAll() { 
} 

Comment puis-je obtenir CodeDom laisser tomber le « {} », qui résoudra l'erreur du compilateur I » Je commence à essayer de compiler? Je pensais juste utiliser un CodeSnippetStatement (ce que je préférerais ne pas faire, puisque cela va à l'encontre de l'objectif d'utiliser CodeDom en premier lieu), mais je ne trouve pas de place dans la classe CodeTypeDeclaration pour ajouter des extraits.

Alors: Je dois soit

  1. Ajouter une méthode d'implémentation moins à une classe
  2. Ajouter un extrait aléatoire à une classe
  3. Mystery option 3

Répondre

6

OK, voici ce que je faisais:

internal List<CodeMemberField> createEventHooks() 
    { 
     string[] eventNames = new string[] { "OnUpdate()", "OnInsert()", "OnDelete()", "OnSelect()", "OnSelectAll()" }; 
     List<CodeMemberField> eventHooks = new List<CodeMemberField>(); 

     foreach (string eventName in eventNames) 
     { 
      CodeMemberField eventHook = new CodeMemberField(); //do it as a FIELD instead of a METHOD 
      eventHook.Name = eventName; 
      eventHook.Attributes = MemberAttributes.ScopeMask; 
      eventHook.Type = new CodeTypeReference("partial void"); 
      eventHooks.Add(eventHook); 
     } 
     return eventHooks; 
    } 

Fondamentalement, j'ai changé mes méthodes aux champs et inclus les () s dans les noms « sur le terrain ». Toujours un hack mais bat recherche/remplacement du code généré (à peine).

+0

Un hack vraiment intelligent! –

0

J'ai rencontrer ce problème avant d'essayer de générer des signatures PInvoke via le CodeDom. Après beaucoup d'enquête, j'ai trouvé que ce n'est pas possible avec PInvoke et je pense que c'est la même chose pour les méthodes partielles.

La meilleure façon de contourner ce problème était de générer le fichier tel quel. J'ai noté toutes les méthodes que j'avais l'intention d'utiliser pour nommer PInvoke. J'ai ensuite cherché dans le fichier à la recherche de ces signatures de méthode avec une regex et remplacé le {}'s par un point-virgule.

C'est un hack horrible, mais il fait le travail.

Questions connexes