2009-04-25 23 views
7

¿Es posible definir un DynamicMethod con parámetros de tipo genéricos? La clase MethodBuilder tiene el método DefineGenericParameters. ¿DynamicMethod tiene una contraparte? Por ejemplo, ¿es posible crear un método con una firma como el golpe dado usando DynamicMethod?DynamicMethod con parámetros de tipo genérico

void T Foo<T>(T a1, int a2) 
+1

Si va a crear dinámicamente el método a continuación, no lo sabes los tipos cuando se genera el método? ¿Qué eliminaría la necesidad de tener un método dinámico genérico? – Steven

+0

Escribo un pequeño intérprete y quiero usar DynamicMethods para compilar las funciones. El lenguaje tiene soporte para polimorfismo paramétrico y hubiera sido bueno usar parámetros de tipo y no tener que generar sobrecargas para cada combinación de parámetros. – Alex

+1

Consulte: https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2508820-dynamicmethod-to-support-generic-type-parameters-l para votar para que se agregue soporte. – cdiggins

Respuesta

2

En realidad no hay de una manera, no es exactamente genérico pero obtendrá la idea:

public delegate T Foo<T>(T a1, int a2); 

public class Dynamic<T> 
{ 
    public static readonly Foo<T> Foo = GenerateFoo<T>(); 

    private static Foo<V> GenerateFoo<V>() 
    { 
     Type[] args = { typeof(V), typeof(int)}; 

     DynamicMethod method = 
      new DynamicMethod("FooDynamic", typeof(V), args); 

     // emit it 

     return (Foo<V>)method.CreateDelegate(typeof(Foo<V>)); 
    } 
} 

Se le puede llamar así:

Dynamic<double>.Foo(1.0, 3); 
+0

En realidad, no es una mala idea :). Lo tendré en cuenta si vuelvo a enfrentar este problema. También estoy seleccionando su respuesta como respuesta, ya que se acerca a la solución del problema original. Gracias. – Alex

7

Esto no parece ser posible: como usted ha visto DynamicMethod tiene ningún método DefineGenericParameters, y se hereda MakeGenericMethod de su clase MethodInfo base, que acaba de lanza NotSupportedException.

Un par de posibilidades:

  • definir un ensamblaje dinámico entera usando AppDomain.DefineDynamicAssembly
  • Haz genéricos a sí mismo, mediante la generación de la misma DynamicMethod una vez por cada conjunto de argumentos de tipo
+0

Gracias. Eso es a lo que le tenía miedo. Supongo que no hay otra manera. Aunque sería bueno tener soporte para esto con DynamicMethods. – Alex

Cuestiones relacionadas