2014-02-14 22 views
0

一個通用的基礎方法,我有下面的類:(FYI:我不能編輯基類)如何調用與TypeBuilder

public abstract class BaseClass 
{ 
    protected TOutput Convert<TInput, TOutput>(TInput input) 
    { 
     return (TOutput)System.Convert.ChangeType(input, typeof(TOutput)); 
    } 
} 

什麼,我試圖建立,是一個動態的類型像這樣:

public class DynamicClass : BaseClass 
{ 
    public string Convert(int value) 
    { 
     return base.Convert<int, string>(value); 
    } 
} 

,我用它來構建動態式的方法,看起來是這樣的:

private MethodBuilder BuildConvertMethod(TypeBuilder typeBuilder) 
{ 
    var baseConvertMethod = typeof(BaseClass).GetMethod("Convert", BindingFlags.NonPublic | BindingFlags.CreateInstance | BindingFlags.Instance); 
    var baseConvertMethodInstance = baseConvertMethod.MakeGenericMethod(typeof(int), typeof(string)); 

    var convertMethodBuilder = typeBuilder.DefineMethod("Convert", MethodAttributes.Public, typeof(string), new[] { typeof(int) }); 

    var convertMethodILGenerator = convertMethodBuilder.GetILGenerator(); 
    convertMethodILGenerator.Emit(OpCodes.Nop); 
    convertMethodILGenerator.Emit(OpCodes.Ldarg_0); 
    convertMethodILGenerator.Emit(OpCodes.Ldarg_1); 
    convertMethodILGenerator.Emit(OpCodes.Call, baseConvertMethodInstance); 
    convertMethodILGenerator.Emit(OpCodes.Ldloc_0); 
    convertMethodILGenerator.Emit(OpCodes.Ret); 

    return convertMethodBuilder; 
} 

類型SUCC的創建電火工品。 但是,當我創建DynamicClass的一個實例,然後調用轉換方法,我得到以下異常:

System.Reflection.TargetInvocationException:異常已通過調用的目標引發異常。 ----> System.InvalidProgramException:公共語言運行時檢測到無效的程序。

有人可以幫我解決這個問題嗎?

回答

0

Call指令將堆棧上的返回值壓入,因此您可以直接調用Ret

var convertMethodILGenerator = convertMethodBuilder.GetILGenerator(); 
convertMethodILGenerator.Emit(OpCodes.Ldarg_0); 
convertMethodILGenerator.Emit(OpCodes.Ldarg_1); 
convertMethodILGenerator.Emit(OpCodes.Call, baseConvertMethodInstance); 
convertMethodILGenerator.Emit(OpCodes.Ret); 
+0

非常感謝。它馬上工作。 :-) –