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

được sản xuất đoạn mã sau:Làm thế nào để thêm một phương pháp từng phần mà không một thực hiện sử dụng CodeDOM

partial void OnUpdate() { 
} 

partial void OnInsert() { 
} 

partial void OnDelete() { 
} 

partial void OnSelect() { 
} 

partial void OnSelectAll() { 
} 

Làm thế nào tôi có thể nhận được CodeDOM để thả "{}", mà sẽ giải quyết các lỗi biên dịch tôi m đang cố gắng biên dịch? Tôi nghĩ chỉ cần sử dụng một CodeSnippetStatement (mà tôi không muốn làm, vì điều này đánh bại mục đích sử dụng CodeDom ngay từ đầu), nhưng tôi không thể tìm thấy một nơi trong lớp CodeTypeDeclaration để thêm đoạn mã.

Vì vậy: Tôi cần một trong hai

  1. Thêm một phương pháp thực hiện, ít hơn để một lớp
  2. Thêm một đoạn mã ngẫu nhiên để một lớp
  3. Bí ẩn tùy chọn thứ 3

Trả lời

6

OK, đây là những gì tôi đã làm:

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

Về cơ bản, tôi đã thay đổi phương pháp của tôi để các lĩnh vực và bao gồm các () s trong những cái tên "trường". Vẫn là một hack nhưng đánh bại tìm kiếm/thay thế mã được tạo ra (hầu như không).

+0

Một hack thực sự thông minh! –

0

Tôi đã chạy vào vấn đề này trước khi cố gắng tạo ra các chữ ký PInvoke thông qua CodeDom. Sau rất nhiều cuộc điều tra, tôi thấy rằng không thể đạt được điều này với PInvoke và tôi nghĩ điều tương tự cũng đúng với các phương pháp từng phần.

Cách tốt nhất tôi tìm được để giải quyết vấn đề này là tạo tệp như vậy. Tôi đã lưu ý tất cả các phương pháp mà tôi dự định là PInvoke theo tên. Sau đó, tôi tìm kiếm thông qua tệp tìm kiếm các chữ ký phương thức đó bằng regex và thay thế {}'s bằng dấu chấm phẩy.

Đó là một hack khủng khiếp nhưng nó được thực hiện công việc.

Các vấn đề liên quan