Reflection.Emit 创建泛型继承方法

4
首先,我想说这是为了大学项目而做的,所以我不是在寻找解决方案,而是希望帮助理解我做错了什么,这样我就可以尝试修复它。
我需要动态创建一个继承另一个类的类。每个方法都应该调用基础方法,同时添加额外的代码(在这种情况下,将 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 How To: Define Generic Method等内容,但都没有结果。
我的构建方法代码如下: (已编辑)
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异常,指出方法的主体签名和声明不匹配。我已经发现这个问题是关于泛型参数的。
但是,我无法理解如何解决这个问题。
任何帮助都将不胜感激。

创建一个实现另一个类的类 - 你是指“...继承另一个类”吗?你不能实现另一个类;它已经被实现了。这就是为什么它是一个类。至于你如何获得四个赞同而没有一个好的、最小的、完整的代码示例,清楚地展示了问题,我不知道。简单地说,你的问题没有足够的细节来以明确、高效的方式回答它。 - Peter Duniho
感谢您的输入,我已经修复了代码和文本,并尽力解释更清楚我的意图。 - Tiago Magalhães
1个回答

1

好的,我已经解决了我的问题...基本上,我对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);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接