Имея класс
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
вместо)?