2012-03-21 15 views
5

Có thể sử dụng Generics với Máy phát điện IL không?generics với IL?

 DynamicMethod method = new DynamicMethod(
      "GetStuff", typeof(int), new Type[] { typeof(object) }); 

     ILGenerator il = method.GetILGenerator(); 

     ... etc 
+1

thể trùng lặp của [DynamicMethod với các tham số kiểu chung chung] (http : //stackoverflow.com/questions/788618/dynamicmethod-with-generic-type-parameters) –

+0

Nó không rõ ràng từ câu hỏi của bạn: bạn có muốn tạo ra một phương thức chung chung hoặc chỉ sử dụng một số loại chung chung (hoặc phương pháp) bên trong nó? – svick

+0

@svick: Tôi muốn tạo động một phương pháp chung. – sgtz

Trả lời

8

Có, có thể, nhưng không phải với lớp DynamicMethod. Nếu bạn bị giới hạn sử dụng lớp này, bạn sẽ không may mắn. Thay vào đó, nếu bạn có thể sử dụng đối tượng MethodBuilder, hãy đọc tiếp.

Phát cơ thể của một phương pháp chung là, với hầu hết các ý định và mục đích, không khác với việc phát ra các phương pháp khác, ngoại trừ việc bạn có thể tạo biến cục bộ của các kiểu chung. Dưới đây là một ví dụ về việc tạo ra một phương pháp chung sử dụng MethodBuilder với T luận chung và tạo ra một địa phương của loại T:

MethodBuilder method; 
//... Leaving out code to create MethodBuilder and store in method 
var genericParameters = method.DefineGenericParameters(new[] { "T" }); 
var il = method.GetILGenerator(); 
LocalBuilder genericLocal = il.DeclareLocal(genericParameters[0]); 

Để phát ra một lời kêu gọi rằng phương pháp chung từ một phương pháp khác, sử dụng mã này. Giả sử method là một MethodInfo hay MethodBuilder đối tượng mô tả một định nghĩa phương pháp chung chung, bạn có thể phát ra một lời kêu gọi phương pháp đó với tham số chung đơn int như sau:

il.EmitCall(OpCodes.Call, method.MakeGenericMethod(typeof(int)), new[] { typeof(int) })); 
+1

Thay vì gọi 'GetGenericArguments()', bạn có thể sử dụng mảng được trả về bởi 'DefineGenericParameters()'. – svick

+0

Cảm ơn, tôi không biết điều đó. Bây giờ nó đã được sửa. – aboveyou00

+0

Cảm ơn @svick & aboveyouOO. Tôi đọc trên SO rằng nó không phải là có thể, và suy nghĩ để hỏi anyway - Tôi hy vọng rằng thông tin đó có thể đã được cho một phiên bản trước của. – sgtz