2015-04-13 57 views
4

首先,我想说这是为了一个大学项目,所以我没有寻找解决方案,只是帮助理解我做错了什么,所以我可以尝试修理它。Reflection.Emit创建泛型继承方法

我需要动态创建一个继承另一个类的类。每个方法都需要调用基本方法,同时添加额外的代码(在这种情况下,将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,说的签名正文和方法的声明不匹配,我设法发现问题是关于通用参数。

但是,我不明白如何解决它。

任何帮助,将不胜感激。

+0

_“创建一个实现另一个类的类”_ - 你的意思是“...那个_inherits_另一个类”?你不能实现另一个班级;它已经被执行。这就是为什么它是一个班。至于如何得到四个没有[很好,_minimal_,_complete_代码示例](http://stackoverflow.com/help/mcve)的表决清楚地表明问题,我不知道。完全可以说,你的问题中没有足够的细节来清晰,有效地回答问题。 –

+0

感谢您的输入,我已经对代码和文本做了一些修改,尝试并更好地解释我想要的内容。 –

回答

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); 

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