【问题标题】:DynamicMethod with generic type parameters具有泛型类型参数的 DynamicMethod
【发布时间】:2009-04-25 09:51:49
【问题描述】:

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

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

【问题讨论】:

  • 如果您是动态创建方法,那么您在生成方法时不会知道类型吗?哪个可以消除对通用动态方法的需求?
  • 我正在写一个小解释器,我想使用 DynamicMethods 来编译函数。该语言支持参数多态性,使用类型参数并且不必为每个参数组合生成重载会很好。
  • 请参阅:visualstudio.uservoice.com/forums/121579-visual-studio/… 对添加支持进行投票。

标签: c# reflection reflection.emit dynamicmethod


【解决方案1】:

这似乎是不可能的:正如您所见,DynamicMethod 没有 DefineGenericParameters 方法,它从其 MethodInfo 基类继承 MakeGenericMethod,该基类只是抛出 NotSupportedException

几种可能性:

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

【讨论】:

  • 谢谢。这就是我害怕的。我想没有别的办法了。虽然使用 DynamicMethods 支持这一点会很好。
【解决方案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);

【讨论】:

  • 实际上,这不是一个坏主意:)。如果我再次遇到这个问题,我会记住它。我也选择您的回复作为答案,因为它接近解决原始问题。谢谢。
猜你喜欢
  • 2013-08-17
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多