2009-04-25 19 views
7

È possibile definire un parametro DynamicMethod con parametri di tipo generici? La classe MethodBuilder ha il metodo DefineGenericParameters. DynamicMethod ha una controparte? Ad esempio, è possibile creare un metodo con una firma come quella data in blow usando DynamicMethod?DynamicMethod con parametri di tipo generico

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

se si sta creando in modo dinamico il metodo, allora non ti conoscere i tipi quando si genera il metodo? Quale rimuoverebbe la necessità di avere un metodo dinamico generico? – Steven

+0

Sto scrivendo un piccolo interprete e voglio usare DynamicMethods per compilare le funzioni. Il linguaggio ha il supporto per il polimorfismo parametrico e sarebbe stato bello usare i parametri di tipo e non dover generare sovraccarichi per ciascuna combinazione di parametri. – Alex

+1

Vedere: https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2508820-dynamicmethod-to-support-generic-type-parameters-l per votare se è stato aggiunto il supporto. – cdiggins

risposta

2

realtà esiste un modo, non è esattamente generico ma ti verrà l'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>)); 
    } 
} 

Si può chiamare in questo modo:

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

In realtà, non è una cattiva idea :). Lo terrò a mente se dovessi affrontare nuovamente questo problema. Sto anche selezionando la tua risposta come risposta poiché si avvicina alla risoluzione del problema originale. Grazie. – Alex

7

Questo non sembra essere possibile: come hai visto DynamicMethod non ha un metodo DefineGenericParameters, ed eredita MakeGenericMethod dalla sua classe MethodInfo base, che getta solo NotSupportedException.

Un paio di possibilità:

  • Definire un assembly dinamico intero utilizzando AppDomain.DefineDynamicAssembly
  • fare generici stessi, generando la stessa DynamicMethod volta per ogni insieme di argomenti di tipo
+0

Grazie. Questo è ciò di cui avevo paura. Immagino che non ci sia altro modo. Anche se sarebbe bello avere il supporto per questo con DynamicMethods. – Alex

Problemi correlati