C # испускать вызов универсального метода - PullRequest
0 голосов
/ 21 ноября 2018

Имея класс

class C
{
    public T Get<T>()
    {
        return default;
    }

    public void M()
    {
        int i = this.Get<Int32>();
    }
}

Я хочу сгенерировать тело M во время выполнения, используя Reflection.Emit и ILGenerator, чтобы оно точно соответствовало тому, что показано выше.


То, что я пробовал, это

ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Call, typeof(C).GetMethod(nameof(C.Get), BindingFlags.Instance));

, что дает

ldarg.0
call instance !!0 C::Get<M0>(string)
//                       ^^
ret

, но мне нужно получить

ldarg.0
call instance !!0 C::Get<int32>(string)
//                       ^^^^^
ret

(обратите внимание на различные параметры типа ввызов C.Get<T>)


При отправке вызова универсальной функции, как передать тип универсального параметра (то есть избавиться от M0 и сказать ему:int32 вместо)?

1 Ответ

0 голосов
/ 21 ноября 2018

Вам необходимо заменить аргументы типа на MakeGenericMethod :

ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit
( 
  OpCodes.Call, 
  typeof(C)
  .GetMethod(nameof(C.Get), BindingFlags.Instance)
  .MakeGenericMethod(typeof(int))
);
...