C# 用Mono-Cecil调用泛型方法

C# 用Mono-Cecil调用泛型方法,c#,.net,generics,mono,cil,C#,.net,Generics,Mono,Cil,我想将IL代码注入方法中,这些方法调用一个泛型方法(带有返回类型和参数) 2、将“WriteLine”方法注入choosen方法: ILProcessor ilProcessor = method.Body.GetILProcessor(); Instruction callWriteLine = ilProcessor.Create(OpCodes.Call, writeLine); ilPro

我想将IL代码注入方法中,这些方法调用一个泛型方法(带有返回类型和参数)

2、将“WriteLine”方法注入choosen方法:

                ILProcessor ilProcessor = method.Body.GetILProcessor();

                Instruction callWriteLine = ilProcessor.Create(OpCodes.Call, writeLine);

                ilProcessor.InsertBefore(ins, "CALL");
                ilProcessor.InsertBefore(ins, callWriteLine);
IL_0001: ldstr        "CALL"
IL_0006: call         void [mscorlib]System.Console::WriteLine(string)
这将在choosen方法中产生以下额外的IL指令:

                ILProcessor ilProcessor = method.Body.GetILProcessor();

                Instruction callWriteLine = ilProcessor.Create(OpCodes.Call, writeLine);

                ilProcessor.InsertBefore(ins, "CALL");
                ilProcessor.InsertBefore(ins, callWriteLine);
IL_0001: ldstr        "CALL"
IL_0006: call         void [mscorlib]System.Console::WriteLine(string)
但如果是通用方法,我应该收到以下IL:

IL_0001: ldc.i4.s     10 // 0x0a
IL_0003: ldstr        "CALL"
IL_0008: call         !!0/*int32*/ ReturnTestModule.ReturnTest::MyGenericMethod<int32>(!!0/*int32*/, string)
IL_0001:ldc.i4.s10//0x0a
IL_0003:ldstr“呼叫”
打电话!!0/*int32*/ReturnTestModule.ReturnTest::MyGenericMethod(!!0/*int32*/,字符串)

我必须明确地处理泛型参数和返回值类型,但我不知道该如何处理。

我认为您的思路基本正确。您所要做的就是获得对泛型方法的引用,就像您对非泛型版本所做的那样。不同之处在于,对于泛型方法,这将为您提供打开泛型方法的MethodInfo,您必须首先关闭它,使用
MakeGeneric()
方法并将希望该方法具有的类型作为泛型类型参数传递

public static T MyGenericMethod<T>(T genericArg, string nonGenericArg)
{
    //Do something with genericArg
    return genericArg;
}
MethodInfo openGenericMethod = typeof(Program).GetMethod("MyGenericMethod");
/// this will create a reference to MyGenericMethod<int>()
MethodInfo closedGenericMethod = openGenericMethod.MakeGenericMethod(typeof(int));
MethodInfo openGenericMethod=typeof(Program).GetMethod(“MyGenericMethod”); ///这将创建对MyGenericMethod()的引用 MethodInfo closedGenericMethod=openGenericMethod.MakeGenericMethod(typeof(int));
然后继续获取
MethodReference
,创建
ILProcessor
,并插入指令。

您能否发布一个演示如何注入非泛型方法的小示例?如果我看到你是如何尝试的,我可能会帮助你。添加了非泛型方法示例。