2009-04-25 3 views
7

Ist es möglich, eine DynamicMethod mit generischen Typparametern zu definieren? Die MethodBuilder-Klasse verfügt über die DefineGenericParameters-Methode. Hat die DynamicMethod ein Gegenstück? Zum Beispiel ist es möglich, eine Methode mit einer Signatur wie dem gegebenen Schlag mit DynamicMethod zu erstellen?DynamicMethod mit generischen Typparametern

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

Wenn Sie dynamischen Erstellung des Verfahrens werden dann nicht wissen, dass Sie die Typen, wenn Sie die Methode generieren? Was würde die Notwendigkeit einer generischen dynamischen Methode beseitigen? – Steven

+0

Ich schreibe einen kleinen Interpreter und ich möchte DynamicMethods verwenden, um die Funktionen zu kompilieren. Die Sprache unterstützt parametrischen Polymorphismus und es wäre schön gewesen, Typparameter zu verwenden und keine Überlastungen für jede Parameterkombination zu erzeugen. – Alex

+1

Siehe: https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2508820-dynamicmethod-to-support-generic-type-parameters-l, um abzustimmen, dass Unterstützung hinzugefügt wurde. – cdiggins

Antwort

2

Eigentlich gibt es Ein Weg, es ist nicht wirklich generisch, aber Sie werden die Idee bekommen:

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>)); 
    } 
} 

Sie können es so nennen:

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

Eigentlich ist das keine schlechte Idee :). Ich werde es im Gedächtnis behalten, wenn ich dieses Problem jemals wieder erlebe. Ich wähle auch Ihre Antwort als Antwort, da sie dem ursprünglichen Problem nahe kommt. Vielen Dank. – Alex

7

Dies scheint nicht möglich zu sein: wie Sie DynamicMethod haben keine DefineGenericParameters Methode gesehen haben, und es erbt MakeGenericMethod von seiner MethodInfo Basisklasse, die NotSupportedException nur wirft.

Ein paar Möglichkeiten:

  • eine ganze dynamische Assembly definieren mit AppDomain.DefineDynamicAssembly
  • Sie Generika selbst, indem Sie die gleiche DynamicMethod einmal für jeden Satz von Typargumente zu erzeugen
+0

Danke. Genau davor hatte ich Angst. Ich denke, es gibt keinen anderen Weg. Allerdings wäre es schön, dies mit DynamicMethods zu unterstützen. – Alex