如何使用TypeBuilder调用泛型基本方法

时间:2014-02-14 22:47:28

标签: c# generics reflection.emit 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;
}

该类型的创建成功。 但是当我创建一个DynamicClass实例,然后调用Convert方法时,我得到以下异常:

System.Reflection.TargetInvocationException:调用目标抛出了异常。   ----&GT; System.InvalidProgramException:公共语言运行时检测到无效程序。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分: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);