2012-03-21 10 views
5

È possibile utilizzare i generici con IL Generator?generici con IL?

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

     ILGenerator il = method.GetILGenerator(); 

     ... etc 
+1

possibile duplicato di [DynamicMethod con parametri di tipo generico] (http : //stackoverflow.com/questions/788618/dynamicmethod-with-generic-type-parameters) –

+0

Non è chiaro dalla tua domanda: vuoi creare un metodo generico o semplicemente utilizzare qualche tipo generico (o metodo) al suo interno? – svick

+0

@svick: voglio creare dinamicamente un metodo generico. – sgtz

risposta

8

Sì, è possibile, ma non con la classe DynamicMethod. Se sei limitato ad usare questa classe, sei sfortunato. Se invece è possibile utilizzare un oggetto MethodBuilder, continua a leggere.

L'emissione del corpo di un metodo generico non è diversa dall'emissione del corpo di altri metodi, ad eccezione del fatto che è possibile creare variabili locali dei tipi generici. Ecco un esempio di creazione di un metodo generico utilizzando MethodBuilder con il generico tesi T e creando un locale di 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]); 

per emettere una chiamata a tale metodo generico da un altro metodo, utilizzare questo codice. Supponendo method è un oggetto MethodInfo o MethodBuilder che descrive una definizione di metodo generico, è in grado di emettere una chiamata a quel metodo con il singolo parametro generico int come segue:

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

Invece di chiamare 'GetGenericArguments()' puoi usare l'array restituito da 'DefineGenericParameters()'. – svick

+0

Grazie, non lo sapevo. È riparato ora. – aboveyou00

+0

Grazie a @svick e aboveyouOO. Ho letto su SO che non era possibile, e ho pensato di chiedere comunque - speravo che quella informazione potesse essere stata per una versione precedente di .net – sgtz