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

का उपयोग कर निम्नलिखित कोड का निर्माण कर रहा है बिना एक आंशिक विधि कैसे जोड़ें:एक कार्यान्वयन CodeDom

partial void OnUpdate() { 
} 

partial void OnInsert() { 
} 

partial void OnDelete() { 
} 

partial void OnSelect() { 
} 

partial void OnSelectAll() { 
} 

मैं CodeDom "{}" ड्रॉप कैसे प्राप्त कर सकते हैं, जो संकलक त्रुटि मैं हल होगा मैं संकलन करने की कोशिश कर रहा हूँ? मैंने केवल CodeSnippetStatement का उपयोग करने के बारे में सोचा (जो मैं नहीं करता, क्योंकि यह पहली जगह कोडडॉम का उपयोग करने के उद्देश्य को हरा देता है), लेकिन मुझे स्निपेट जोड़ने के लिए CodeTypeDeclaration कक्षा में कोई स्थान नहीं मिल रहा है।

तो: मैं या तो

  1. एक वर्ग के लिए एक कार्यान्वयन कम विधि जोड़ें करने की जरूरत है
  2. एक वर्ग
  3. रहस्य 3 विकल्प

उत्तर

6

ठीक है, यहाँ मैं क्या किया है:

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

असल में, मैं क्षेत्रों के लिए मेरी तरीकों को बदल दिया और "क्षेत्र" के नाम में शामिल () रों। अभी भी एक हैक लेकिन उत्पन्न कोड को खोज/बदलता है (मुश्किल से)।

+0

एक वास्तव में स्मार्ट हैक! –

0

मैंने करने के लिए एक यादृच्छिक स्निपेट जोड़ें CodeDom के माध्यम से PInvoke हस्ताक्षर उत्पन्न करने की कोशिश करने से पहले इस समस्या में भागो। बहुत सी जांच के बाद मैंने पाया कि PInvoke के साथ इसे हासिल करना संभव नहीं है और मुझे लगता है कि यह आंशिक तरीकों के लिए भी संभव है।

मुझे इस तरह के काम करने के लिए सबसे अच्छा तरीका फ़ाइल उत्पन्न करना था। मैंने उन सभी विधियों को नोट किया जिन्हें मैं नाम से PInvoke बनना चाहता था। फिर मैंने फ़ाइल के माध्यम से उन विधि हस्ताक्षरों को रेगेक्स के साथ खोजा और {}'s को अर्धविराम के साथ बदल दिया।

यह एक भयानक हैक है लेकिन यह काम पूरा हो जाता है।

संबंधित मुद्दे