2012-03-21 19 views
5

¿Es posible usar genéricos con IL Generator?genéricos con IL?

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

     ILGenerator il = method.GetILGenerator(); 

     ... etc 
+1

posible duplicado de [DynamicMethod con parámetros de tipo genérico] (http : //stackoverflow.com/questions/788618/dynamicmethod-with-generic-type-parameters) –

+0

No está claro a partir de su pregunta: ¿desea crear un método genérico o simplemente usar algún tipo genérico (o método) dentro de él? – svick

+0

@svick: Quiero crear dinámicamente un método genérico. – sgtz

Respuesta

8

Sí, es posible, pero no con la clase DynamicMethod. Si está restringido a usar esta clase, no tiene suerte. Si puede usar un objeto MethodBuilder, siga leyendo.

Emitir el cuerpo de un método genérico es, para la mayoría de los propósitos, no es diferente de emitir el cuerpo de otros métodos, excepto que puede hacer variables locales de los tipos genéricos. Aquí está un ejemplo de la creación de un método genérico usando MethodBuilder con el argumento genérico T y la creación de un local del tipo 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]); 

para emitir una llamada a ese método genérico de otro método, utilice este código. Suponiendo method es un objeto MethodInfo o MethodBuilder que describe una definición de método genérico, que puede emitir una llamada a ese método con el parámetro genérico único int como sigue:

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

En lugar de llamar a 'GetGenericArguments()' puede usar la matriz devuelta por 'DefineGenericParameters()'. – svick

+0

Gracias, no lo sabía. Está arreglado ahora. – aboveyou00

+0

Gracias @svick y aboveyouOO. Leí en SO que no era posible, y pensé en preguntar de todos modos, esperaba que esa información podría haber sido para una versión anterior de .net – sgtz