DynamicMethod с параметрами универсального типа - PullRequest
8 голосов
/ 25 апреля 2009

Можно ли определить DynamicMethod с параметрами универсального типа? Класс MethodBuilder имеет метод DefineGenericParameters. Есть ли у DynamicMethod аналог? Например, возможно ли создать метод с сигнатурой, подобной той, которая была дана с помощью DynamicMethod?

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

Ответы [ 2 ]

7 голосов
/ 25 апреля 2009

Это кажется невозможным: как вы видели, DynamicMethod не имеет DefineGenericParameters метода, и он наследует MakeGenericMethod от своего базового класса MethodInfo, который просто выбрасывает NotSupportedException. * 1006. *

Пара возможностей:

  • Определить всю динамическую сборку, используя AppDomain.DefineDynamicAssembly
  • Делайте генерики самостоятельно, генерируя один и тот же DynamicMethod один раз для каждого набора аргументов типа
3 голосов
/ 26 марта 2014

На самом деле есть способ, он не совсем общий, но вы поймете:

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