DynamicMethod具有泛型类型参数

时间:2009-04-25 09:51:50

标签: c# reflection reflection.emit dynamicmethod

是否可以使用泛型类型参数定义DynamicMethod? MethodBuilder类具有DefineGenericParameters方法。 DynamicMethod有对应的吗?例如,是否可以使用DynamicMethod创建具有签名的方法?

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

2 个答案:

答案 0 :(得分:7)

这似乎不可能:因为您看到DynamicMethod没有DefineGenericParameters方法,并且它从MakeGenericMethod基类继承MethodInfo,只是抛出NotSupportedException

有几种可能性:

  • 使用AppDomain.DefineDynamicAssembly
  • 定义整个动态程序集
  • 自己做泛型,通过为每组类型参数生成相同的DynamicMethod一次

答案 1 :(得分:3)

实际上有一种方法,它不是完全通用的,但你会明白:

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