2011-12-21 25 views
7

Tôi đã lập trình .NET và C# trong nhiều năm nay, nhưng gần đây chỉ gặp loại DynamicMethod cùng với khái niệm về một hội động trong bối cảnh phản ánh. Chúng dường như luôn được sử dụng trong thế hệ IL (mã thời gian chạy).Tập hợp và phương pháp động

Thật không may MSDN thực hiện công việc vô cùng nghèo nàn khi xác định phương thức hoạt động/phương thức động là và cũng nên sử dụng chúng. Có thể nào làm sáng tỏ tôi ở đây không? Có liên quan gì đến DLR không? Làm thế nào chúng khác nhau với thế hệ tĩnh (bình thường) của các hội đồng và phương pháp trong thời gian chạy? Tôi nên biết gì về cách thức và thời điểm sử dụng chúng?

+0

Không có loại có tên "DynamicAssembly" trong khung. Bạn đang nói về AssemblyBuilder? Các hướng dẫn MSDN Reflection.Emit là ở đây: http://msdn.microsoft.com/en-us/library/3y322t50.aspx –

+0

@ Rig Rigby: Chúc mừng. – Noldorin

+0

@ HansPassant: Được rồi, có thể không có loại nào, nhưng chắc chắn là một khái niệm: http://msdn.microsoft.com/en-us/library/4xtysk39.aspx – Noldorin

Trả lời

4

DynamicMethod được sử dụng để tạo phương thức mà không cần bất kỳ lắp ráp mới nào. Chúng cũng có thể được tạo cho một lớp, vì vậy bạn có thể truy cập vào các thành viên riêng tư của nó. Cuối cùng, lớp DynamicMethod sẽ xây dựng một đại biểu bạn có thể sử dụng để thực hiện phương thức. Ví dụ: để truy cập vào trường riêng tư:

var d = new DynamicMethod("my_dynamic_get_" + field.Name, typeof(object), new[] { typeof(object) }, type, true); 
var il = d.GetILGenerator(); 
il.Emit(OpCodes.Ldarg_0); 
il.Emit(OpCodes.Ldfld, field); 
if (field.FieldType.IsValueType) 
    il.Emit(OpCodes.Box, field.FieldType); 
else 
    il.Emit(OpCodes.Castclass, typeof(object)); 

il.Emit(OpCodes.Ret); 
var @delegate = (Func<object, object>)d.CreateDelegate(typeof(Func<object, object>)); 

Hy vọng điều đó sẽ hữu ích.

+0

Và nó không có gì để làm với DLR. Đó là một phương pháp được tạo ra khi đang bay. – ivowiblo

+0

Ah, tôi hiểu rồi. Điều đó xóa nó một chút tốt, vì vậy cảm ơn cho điều đó. Có tương đương trong một loại * động * hay không? Hoặc những gì về lắp ráp? Tôi nghĩ rằng tôi có thể luôn luôn tạo ra các hội đồng trên bay trong quá khứ, và tôi không nhớ từ "năng động" đi vào nó thực sự. – Noldorin

+0

Đối với các loại và cụm, nó chỉ là một cách đặt tên. DynamicMethod là một lớp thực tế. – ivowiblo

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