2009-04-25 219 views
7

是否可以使用泛型類型參數定義DynamicMethod? MethodBuilder類具有DefineGenericParameters方法。 DynamicMethod是否有對應的?例如,是否有可能使用DynamicMethod創建一個具有簽名的方法?具有泛型類型參數的DynamicMethod

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

如果您是動態創建的方法,那麼你不知道的類型,當你生成的方法?這將消除需要有一個通用的動態方法? – Steven 2009-04-25 13:29:18

+0

我在寫一個小解釋器,我想用DynamicMethods來編譯函數。該語言支持參數多態,並且使用類型參數並不需要爲每個參數組合生成重載。 – Alex 2009-04-25 17:45:22

+1

請參閱:https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2508820-dynamicmethod-to-support-generic-type-parameters-l投票支持添加支持。 – cdiggins 2014-07-10 16:02:48

回答

2

其實有一種方式,它不是一般的,但你會得到這樣的想法:

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

你可以這樣調用:

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

這似乎並不可能:如您所見DynamicMethod沒有DefineGenericParameters方法,它從它的MethodInfo基類,只是拋出NotSupportedException繼承MakeGenericMethod

幾個可能的原因:

  • 定義使用AppDomain.DefineDynamicAssembly
  • 自己做仿製藥的整體動態組裝,通過產生相同DynamicMethod一次爲每個組的類型參數