Как вернуть Task.FromResult‹bool›(true) с помощью mono cecil?

Мне нужно использовать mono cecil для реализации следующей логики.

public Task<bool> MyTask()
{
    return Task.FromResult<bool>(true);
}

Я знаю только, как вызвать необобщенный метод, так как в проекте cecil есть соответствующий демонстрационный код. Я не знаю, как вызвать общий метод. Может ли кто-нибудь сказать мне, как это сделать, пожалуйста? Соответствующий IL-код должен выглядеть так:

Класс вызова ldc.i4.1 [mscorlib]System.Threading.Tasks.Task`1‹!!0› [mscorlib]System.Threading.Tasks.Task::FromResult(!!0) ret

Это то, что у меня есть прямо сейчас:

void Main()
{
    AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(@"F:\files.fm\Code\asm_wrangler\asm_wrangler\bin\Debug\a.exe");

    MethodInfo writeLineMethod = typeof(Debug).GetMethod("WriteLine", new Type[] { typeof(string) });
    MethodReference writeLine = asm.MainModule.Import(writeLineMethod);

    foreach (ModuleDefinition module in asm.Modules)
    {
        foreach (TypeDefinition type in module.Types)
        {
            foreach (var method in type.Methods)
            { 
                if (method.Name == "MyTask")
                {
                    var ins = method.Body.Instructions;
                    ins.Clear();
                    ILProcessor processor = method.Body.GetILProcessor();
                    
                    ins.Add(processor.Create(OpCodes.Ldc_I4_1));
                    
                    // ===> How to invoke Task.FromResult<bool>(true) here?
                    
                    ins.Add(processor.Create(OpCodes.Ret));
                }
            }
        }
    }
}

person Just a learner    schedule 23.03.2021    source источник


Ответы (1)


Вам нужен MakeGenericMethod, тогда вы можете вызывать его как любой другой метод

var ins = method.Body.Instructions;

ILProcessor processor = method.Body.GetILProcessor();
                    
ins.Add(processor.Create(OpCodes.Ldc_I4_1));
ins.Add(processor.Create(OpCodes.Call,
    typeof(Task).GetMethod("FromResult").MakeGenericMethod(typeof(bool)))
ins.Add(processor.Create(OpCodes.Ret));
person Charlieface    schedule 24.03.2021