2009-02-28 55 views
21

Các câu hỏi về Making reflection fly and exploring delegates ...Delegate.CreateDelegate vs DynamicMethod vs Biểu

Nếu tôi cần phải tạo ra các đại biểu Func<T, TResult> với các phương pháp trên các loại động nạp tôi có khả năng có thể sử dụng (1) Delegate.CreateDelegate (2) DynamicMethod (3) Expression cây .

Cho phép nói tập hợp các kiểu/phương thức được tải động được phản ánh một lần khi khởi động ứng dụng qua cấu hình và được sử dụng trong suốt thời gian của ứng dụng (hiệu suất khởi động không phải là vấn đề và bộ nhớ), đại biểu được lưu trong bộ nhớ cache và được gửi đến một cách mạnh mẽ. Các đại biểu này là những con đường nóng được truy cập đồng thời.

Phương pháp ràng buộc động nào bạn thích và tại sao?

Trả lời

19

Nếu chúng thực sự là phương pháp hiện có mà bạn có MethodInfo và chúng có chữ ký phù hợp, thì tôi muốn nói Delegate.CreateDelegate là đúng cách để đi - nó thực hiện chính xác những gì bạn muốn, không ồn ào. Tôi muốn sử dụng DynamicMethod hoặc biểu thức cây nếu tôi cần thiết để xây dựng một đại biểu để thực hiện một số logic mà chưa được chụp trong một phương pháp.

Cây biểu thức là (IMO và tôi chưa sử dụng DynamicMethod tức giận) dễ sử dụng hơn DynamicMethod, nhưng chúng bị hạn chế hơn - về cơ bản chúng chỉ thể hiện một biểu thức duy nhất khóa học). DynamicMethod mang lại cho bạn nhiều sự linh hoạt, nhưng bạn cần hiểu rõ IL một cách hợp lý.

Điều đó có hữu ích không?

+3

phương pháp động đá khi bạn khiến họ làm việc. Bắt họ làm việc mặc dù thường liên quan đến rất nhiều diễn viên tại IL, thất vọng và bouts với peverify. Nhưng chúng tạo ra kết quả tuyệt vời. – JaredPar

+0

Nó cũng xác nhận suy nghĩ của tôi. Googling xung quanh về đại biểu có vẻ như khá một vài folks đang sử dụng DynamicMethod để giải quyết vấn đề này. Tôi có một ứng dụng sử dụng nhiều Delegate.CreateDelegate theo cách tôi mô tả. – jsw

5

Qua blog của Ayende Tôi nhận được liên kết thú vị này thể hiện những điều bạn có thể làm với Phương pháp động. Như một ví dụ nó là khá dễ hiểu:
Accelerating Enum-Based Dictionaries with Generic EnumComparer

Cập nhật

Người ta phải lưu ý rằng trong thế giới của WinRT, Reflection.Emit không có sẵn - một số thông tin có thể được tìm thấy here

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