2009-04-25 19 views
7

Est-il possible de définir un DynamicMethod avec des paramètres de type générique? La classe MethodBuilder a la méthode DefineGenericParameters. Est-ce que DynamicMethod a une contrepartie? Par exemple est-il possible de créer une méthode avec une signature comme celle donnée en utilisant DynamicMethod?DynamicMethod avec paramètres de type générique

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

Si vous créez dynamiquement la méthode alors sauriez-vous pas les types lorsque vous générez la méthode? Ce qui supprimerait le besoin d'avoir une méthode dynamique générique? – Steven

+0

J'écris un petit interprète et je veux utiliser DynamicMethods pour compiler les fonctions. Le langage a un support pour le polymorphisme paramétrique et il aurait été bien d'utiliser des paramètres de type et de ne pas générer de surcharge pour chaque combinaison de paramètres. – Alex

+1

Voir: https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2508820-dynamicmethod-to-support-generic-type-parameters-l pour voter sur l'ajout de support. – cdiggins

Répondre

2

En fait, il est d'une certaine manière, ce n'est pas exactement générique, mais vous aurez l'idée:

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

Vous pouvez l'appeler comme ceci:

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

En fait, ce n'est pas une mauvaise idée :). Je le garderai à l'esprit si jamais je fais face à ce problème encore. Je sélectionne également votre réponse comme réponse car elle se rapproche de la résolution du problème original. Merci. – Alex

7

Cela ne semble pas être possible: que vous avez vu DynamicMethod n'a pas de méthode DefineGenericParameters, et il hérite MakeGenericMethod de son juste, quelle classe de base MethodInfo jette NotSupportedException.

Quelques possibilités:

  • Définir un ensemble dynamique tout en utilisant AppDomain.DefineDynamicAssembly
  • Est-ce que les médicaments génériques vous, en générant la même DynamicMethod une fois pour chaque série d'arguments de type
+0

Merci. C'est ce dont j'avais peur. Je suppose qu'il n'y a pas d'autre moyen. Bien qu'il serait bien d'avoir un support pour cela avec DynamicMethods. – Alex