首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用TypeBuilder调用泛型基方法

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

Stack Overflow用户
提问于 2014-02-14 22:47:27
回答 1查看 764关注 0票数 1

我有以下类:(FYI:我无法编辑基类)

代码语言:javascript
复制
public abstract class BaseClass
{
    protected TOutput Convert<TInput, TOutput>(TInput input)
    {
        return (TOutput)System.Convert.ChangeType(input, typeof(TOutput));
    }
}

我想要建立的是这样一种动态类型:

代码语言:javascript
复制
public class DynamicClass : BaseClass
{
    public string Convert(int value)
    {
        return base.Convert<int, string>(value);
    }
}

用于构建动态类型的方法如下所示:

代码语言:javascript
复制
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实例,然后调用转换方法时,我会得到以下异常:

System.Reflection.TargetInvocationException :调用的目标引发了异常。-> System.InvalidProgramException :公共语言运行时检测到一个无效的程序.

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-14 23:08:02

Call指令推送堆栈上的返回值,这样您就可以直接调用Ret了。

代码语言:javascript
复制
var convertMethodILGenerator = convertMethodBuilder.GetILGenerator();
convertMethodILGenerator.Emit(OpCodes.Ldarg_0);
convertMethodILGenerator.Emit(OpCodes.Ldarg_1);
convertMethodILGenerator.Emit(OpCodes.Call, baseConvertMethodInstance);
convertMethodILGenerator.Emit(OpCodes.Ret);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21790853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档