2009-04-25 16 views
7

Czy możliwe jest zdefiniowanie DynamicMethod z typowymi parametrami? Klasa MethodBuilder ma metodę DefineGenericParameters. Czy DynamicMethod ma odpowiednika? Na przykład czy możliwe jest stworzenie metody z podpisem podobnym do zadanego ciosu za pomocą DynamicMethod?DynamicMethod z ogólnymi parametrami typu

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

Jeśli dynamicznie tworząc metodę wtedy nie wiem typy podczas generowania metody? Które wyeliminowałoby potrzebę posiadania ogólnej dynamicznej metody? – Steven

+0

Piszę trochę interpretera i chcę użyć DynamicMethods do kompilacji funkcji. Język obsługuje polimorfizm parametryczny i dobrze byłoby używać parametrów typu i nie trzeba generować przeciążeń dla każdej kombinacji parametrów. – Alex

+1

Zobacz: https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2508820-dynamicmethod-to-support-generic-type-parameters-l, aby głosować na dodaniu wsparcia. – cdiggins

Odpowiedz

2

Właściwie istnieje sposób, nie jest dokładnie ogólny, ale wpadniesz na pomysł:

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

można nazwać tak:

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

Właściwie to nie jest zły pomysł :). Będę o tym pamiętał, jeśli kiedykolwiek ponownie napotkam ten problem. Wybieram również odpowiedź jako odpowiedź, ponieważ zbliża się do rozwiązania pierwotnego problemu. Dzięki. – Alex

7

To nie wydaje się być możliwe: jak widzieliście DynamicMethod ma DefineGenericParameters metody i dziedziczy MakeGenericMethod od swojej klasie MethodInfo bazowej, która po prostu rzuca NotSupportedException.

Kilka możliwości:

  • Zdefiniuj cały zespół dynamicznych przy użyciu AppDomain.DefineDynamicAssembly
  • Czy generyków siebie, generując taki sam DynamicMethod raz dla każdego zestawu argumentów typu
+0

Dzięki. Tego się bałem. Chyba nie ma innego wyjścia. Choć byłoby miło mieć wsparcie dla tego za pomocą DynamicMethods. – Alex

Powiązane problemy