2010-01-29 22 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; 
     } 

está produciendo el siguiente código:Cómo agregar un método parcial sin una implementación usando CodeDom

partial void OnUpdate() { 
} 

partial void OnInsert() { 
} 

partial void OnDelete() { 
} 

partial void OnSelect() { 
} 

partial void OnSelectAll() { 
} 

¿Cómo puedo obtener CodeDom dejar caer la "{}", que va a resolver el error del compilador I' Estoy tratando de compilar? Pensé simplemente en usar un CodeSnippetStatement (que preferiría no hacer, ya que esto frustra el propósito de usar CodeDom en primer lugar), pero no puedo encontrar un lugar en la clase CodeTypeDeclaration para agregar fragmentos.

Así: Tengo que sea

  1. Añadir un método de implementación en menos de una clase
  2. añadir un fragmento al azar a una clase
  3. misterio tercera opción

Respuesta

6

OK, esto es lo que hice:

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; 
    } 

Básicamente, he cambiado de métodos para campos e incluyó los () s en los nombres de "campo". Sigue siendo un truco pero supera la búsqueda/sustitución del código generado (apenas).

+0

¡Un truco realmente inteligente! –

0

tengo encontrarse con este problema antes de tratar de generar firmas PInvoke a través del CodeDom. Después de mucha investigación descubrí que no es posible lograr esto con PInvoke y creo que lo mismo es cierto para los métodos parciales.

La mejor manera que encontré para solucionar esto fue generar el archivo como está. Anoté todos los métodos que tenía la intención de llamar por nombre. Luego busqué en el archivo buscando esas firmas de métodos con una expresión regular y reemplacé el {}'s con un punto y coma.

Es un hack horrible pero hace el trabajo bien.

Cuestiones relacionadas