дженерики с ИЛ? - PullRequest
       46

дженерики с ИЛ?

5 голосов
/ 21 марта 2012

Можно ли использовать дженерики с Генератором IL?

        DynamicMethod method = new DynamicMethod(
            "GetStuff", typeof(int), new Type[] { typeof(object) });

        ILGenerator il = method.GetILGenerator();

        ... etc

1 Ответ

8 голосов
/ 21 марта 2012

Да, это возможно, но не с классом DynamicMethod.Если вы ограничены в использовании этого класса, вам не повезло.Если вместо этого вы можете использовать объект MethodBuilder, читайте дальше.

Излучение тела универсального метода для большинства намерений и целей ничем не отличается от излучения тела других методов, за исключением того, что вы можете сделатьлокальные переменные универсальных типов.Вот пример создания универсального метода с использованием MethodBuilder с универсальным аргументом T и создания локального типа T:

MethodBuilder method;
//... Leaving out code to create MethodBuilder and store in method
var genericParameters = method.DefineGenericParameters(new[] { "T" });
var il = method.GetILGenerator();
LocalBuilder genericLocal = il.DeclareLocal(genericParameters[0]);

Чтобы отправить вызов этого универсального метода из другого метода, используйте этот код,Предполагая, что method является MethodInfo или MethodBuilder объектом, описывающим определение универсального метода, вы можете отправить вызов этому методу с единственным универсальным параметром int следующим образом:

il.EmitCall(OpCodes.Call, method.MakeGenericMethod(typeof(int)), new[] { typeof(int) }));
...