gpt4 book ai didi

c# - Reflection.Emit 创建通用继承方法

转载 作者:行者123 更新时间:2023-11-30 12:26:17 25 4
gpt4 key购买 nike

首先,我想说这是一个大学项目,所以我不是在寻找解决方案,只是帮助理解我做错了什么,以便我可以尝试修复它。

我需要动态创建一个继承另一个类的类。每个方法都应该调用基本方法,同时添加额外的代码(在本例中,将 MethodInfo 发送到静态方法,因此我可以计算该方法被调用了多少次)。

我想做的一个例子:

public class A
{
public virtual void M1(B arg0, int arg1)
{ //do stuff
}
}

并动态创建:

public class InstrA : A
{
public override void M1(B arg0, int arg1)
{
base.M1(arg0,arg1)
ProfilerCounter.LogMethod(typeof(InstrA).GetMethod("M1"));
}
}

我能够做到这一点,除非有通用方法...我在互联网上搜索过,阅读 MSND 如何:定义通用方法等,但无济于事。

我构建方法的代码如下:(编辑)

public static void BuildMethod(MethodInfo method, TypeBuilder dest)
{
Type[] param_types = GetParameterTypes(method.GetParameters());
MethodBuilder mb = dest.DefineMethod(
method.Name,
method.Attributes);

Type toReturn = method.ReturnType;

mb.SetReturnType(toReturn);
mb.SetParameters(param_types);

//from here I create the IL code, so that it calls base and then adds the methodinfo to a counter
//so that everytime the method is run, it will register
var getMethodMethod = typeof(MethodBase).GetMethod(
"GetMethodFromHandle",
new[] { typeof(RuntimeMethodHandle) });

ILGenerator il_method = mb.GetILGenerator();
il_method.Emit(OpCodes.Ldarg_0);
for (int i = 0; i < param_types.Length; i++)
{
il_method.Emit(OpCodes.Ldarg, i + 1);
}
il_method.Emit(OpCodes.Call, method);
il_method.Emit(OpCodes.Ldtoken, method);
il_method.Emit(OpCodes.Call, getMethodMethod);
il_method.Emit(OpCodes.Castclass, typeof(MethodInfo));
il_method.Emit(OpCodes.Call, typeof(ProfilerCounter).GetMethod("LogMethod"));
il_method.Emit(OpCodes.Ret);

dest.DefineMethodOverride(mb, method);
}

当我尝试使用 TypeBuilder.CreateType() 创建类型时,它会抛出 TypeLoadException,表示正文的签名和方法的声明不匹配,我设法发现问题在于通用参数。

但是,我无法理解如何修复它。

如有任何帮助,我们将不胜感激。

最佳答案

好的,我已经能够解决我的问题...基本上,我对 MethodBuilder.DefineGenericParameter(..) 的含义感到困惑

反正我加了下面的代码

MethodBuilder mb = dest.DefineMethod(
method.Name,
method.Attributes);

if (method.IsGenericMethod)
{
Type[] genericTypes = method.GetGenericArguments();
foreach (Type t in genericTypes)
{
mb.DefineGenericParameters(t.Name);
}
}

mb.SetReturnType(method.ReturnType);
mb.SetParameters(param_types);

所以基本上...我没有在方法构建器中定义我的通用参数。

关于c# - Reflection.Emit 创建通用继承方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29596097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com