具有泛型类型参数的 DynamicMethod

发布于 2024-07-18 16:40:29 字数 209 浏览 9 评论 0原文

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

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

Is it possible to define a DynamicMethod with generic type parameters? The MethodBuilder class has the DefineGenericParameters method. Does the DynamicMethod have a counterpart? For example is it possible to create method with a signature like the one given blow using DynamicMethod?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

内心旳酸楚 2024-07-25 16:40:29

这似乎不可能:正如您所见,DynamicMethod 没有 DefineGenericParameters 方法,并且它从其 继承了 MakeGenericMethod MethodInfo 基类,仅抛出 NotSupportedException

几种可能性:

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

This doesn't appear to be possible: as you've seen DynamicMethod has no DefineGenericParameters method, and it inherits MakeGenericMethod from its MethodInfo base class, which just throws NotSupportedException.

A couple of possibilities:

  • Define a whole dynamic assembly using AppDomain.DefineDynamicAssembly
  • Do generics yourself, by generating the same DynamicMethod once for each set of type arguments
岁月染过的梦 2024-07-25 16:40:29

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

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

Actually there is a way, it's not exactly generic but you'll get the idea:

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

You can call it like this:

Dynamic<double>.Foo(1.0, 3);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文