2009-04-02 23 views
7

Tôi đã được saddled với việc sử dụng một thư viện truy cập dữ liệu trong nhà đó là một cách hiệu quả XML thông qua một thủ tục lưu trữ, mà trả về XML. Không có gì tôi có thể làm về việc này. Tôi đã cố gắng để ActiveRecord được chấp thuận, nhưng yêu cầu của tôi đã bị từ chối. Tuy nhiên, bằng cách sử dụng mã tuyệt vời được cung cấp tại http://blog.bodurov.com/Post.aspx?postID=27, tôi đã thêm một phương thức mở rộng vào IEnumerable để chuyển đổi cặp khóa-giá trị mà tôi tạo ra từ XML bị rách trở lại thành các đối tượng được nhập mạnh mẽ, hoàn chỉnh với tên thuộc tính!Làm cách nào để đính kèm một phương thức vào kiểu C# được tạo động khi chạy?

này:

dict["keyName1"] 

trở thành

MyObject.keyName1 

Bây giờ giao diện hỗ trợ databinding! Tuyệt đấy! Tuy nhiên, tôi muốn tiến thêm một bước nữa. Tôi muốn các đối tượng phát ra có Save() phương pháp quá, để tôi có thể ape mẫu ActiveRecord và cung cấp cho các web của tôi với một lớp đối tượng trực quan để sử dụng từ ASP.net.

Làm cách nào để viết phương thức trong Visual Studio, trong mã nguồn và đính kèm nó vào thời gian chạy cho các đối tượng được phát ra? Tôi không quan tâm đến (hoặc đủ điều kiện) viết lắp ráp hoặc IL. Tôi muốn làm điều này trong C#. Đây là câu hỏi StackOverflow đầu tiên của tôi và tôi đăng bài này với IE6 do công ty uỷ nhiệm, vì vậy hãy nhẹ nhàng.

Trả lời

2

Từ những gì tôi thu thập được trên bài viết đó, nó tạo các loại ẩn danh cho bạn và bạn đang sử dụng các loại đó để lấy các giá trị. Nếu đúng như vậy, không có cách nào dễ dàng để thêm các phương thức vào các đối tượng đó. Tuy nhiên, nếu cấu trúc XML sẽ giống nhau mỗi lần SP thực hiện, tại sao không tạo ra một lớp cụ thể có tất cả các thuộc tính bạn cần, và tự điền một tập hợp các đối tượng đó với XML. Bằng cách đó, bạn có thể dễ dàng thêm bất kỳ phương pháp bạn cần trực tiếp vào lớp ...

EDIT: Dựa trên cuộc thảo luận của chúng tôi trong các ý kiến, đây là một ý nghĩ:

Trong đoạn mã đó, khi bạn đang xây dựng lên loại, bạn đang sử dụng: ModuleBuilder.DefineType. Có một quá tải để DefineType có một loại để mở rộng. Link.. Do đó, tạo một giao diện (nó không phải là sự kiện phải có bất kỳ phương thức nào trong nó), và khi bạn đang xây dựng kiểu động, hãy mở rộng giao diện đó bằng cách sử dụng quá tải mà tôi đã liên kết với bạn. Sau đó, tạo một phương thức mở rộng trên giao diện đó thực hiện Save().

Có một tình trạng quá tải mà có thể quan tâm rằng có một loại để mở rộng và giao diện:

http://msdn.microsoft.com/en-us/library/f53tx4x8.aspx

EDIT2: Mã mẫu:

Đầu tiên, tạo một giao diện:

public interface ISaveExtentable //I suck at naming stuff :-p 
{ 

} 

Sau đó, trong mã bạn thích trong trang web đó, bạn sẽ tìm thấy một phương thức có tên là GetTypeBuilder. Thay đổi nó như thế này:

 private static TypeBuilder GetTypeBuilder(string typeSigniture) 
     { 
      AssemblyName an = new AssemblyName("TempAssembly" + typeSigniture); 
      AssemblyBuilder assemblyBuilder = 
       AppDomain.CurrentDomain.DefineDynamicAssembly(
        an, AssemblyBuilderAccess.Run); 
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule"); 

      TypeBuilder tb = moduleBuilder.DefineType("TempType" + typeSigniture 
           , TypeAttributes.Public | 
           TypeAttributes.Class | 
           TypeAttributes.AutoClass | 
           TypeAttributes.AnsiClass | 
           TypeAttributes.BeforeFieldInit | 
           TypeAttributes.AutoLayout 
           , typeof(object), new Type[] {typeof(ISaveExtentable)}); 
      return tb; 
     } 

Sau đó, tạo một phương pháp mở rộng trên giao diện đó để làm tiết kiệm:

public static class SaveExtendableExtensions 
    { 
      public static void Save(this ISaveExtentable ise) 
      { 
       //implement save functionality. 
      } 
    } 

Bạn rất có thể sẽ cần phải sử dụng phản ánh trong phương thức Save của bạn để có được tất cả các các thuộc tính kể từ khi loại được tạo động.

+0

"nếu cấu trúc XML sẽ giống nhau mỗi khi SP thực thi" tôi nhận được BRD 1245 RFW 3456 Tên của dự án! vv với các thuộc tính khác nhau mỗi lần: ( –

+0

Có, nhưng tôi chắc chắn có một danh sách các thuộc tính có sẵn để bạn lựa chọn. Đặt tất cả các thuộc tính đó vào lớp là trường không thể bỏ qua (nếu chúng là loại giá trị) Tôi không nghĩ rằng bạn cần phải sử dụng một số giải pháp điên để xây dựng một loại động ... – BFree

+0

XML được tạo động và tôi không muốn phải duy trì một thư viện các lớp cụ thể cho mỗi hoán vị –

1

Tôi nghĩ điều này được gọi là các kết hợp không trực tiếp hoặc dễ dàng có sẵn trong .net. Tuy nhiên, tôi hiểu rằng đây là một trong những lý do chính khiến khung công tác LinFu được thiết kế.

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