使用C#操作代码来发出返回对象的方法

本文关键字:返回 对象 方法 操作 代码 使用 | 更新日期: 2023-09-27 18:27:07

我正在创建一个动态类型,它有一个我想返回对象的方法。我不明白如何做到这一点。到目前为止,我拥有的是:

// .. stuff to create type builder

MethodBuilder builder =
                typeBuilder.DefineMethod(
                    method.Name,
                    MethodAttributes.Virtual | MethodAttributes.Public,
                    method.CallingConvention,
                    method.ReturnType,
                    typeArray1);
            builder.InitLocals = true;
ILGenerator gen = builder.GetILGenerator();
Object myObjectIdLikeToReturn = someMethodCall();
//gen.??(??????????) // here's where I'm lost
gen.Emit(OpCodes.Ldloc_0);
gen.Emit(OpCodes.Ret);

我相信,如果我正确地阅读了msdn,我需要在堆栈上获得myObjectIdLikeToReturn的引用——然而我运气不好。有人能给我指正确的方向吗?

编辑:使其更加清晰。我正在尝试用IL:写类似的东西

public virtual Object MyNewMethod() {
   return myObjectIdLikeToReturn;
}

使用C#操作代码来发出返回对象的方法

您有这行:

Object myObjectIdLikeToReturn = someMethodCall();

你说你"想把对myObjectIdLikeToReturn的引用放到堆栈上",但这是不可能的。我认为你混淆了这些事情发生的时间。IL生成代码类似于编译——一切都需要静态已知。而myObjectIdLikeToReturn是一个在生成代码时碰巧存在的变量,但对实际生成的类没有任何意义。你不能"烘焙"对某个任意运行时对象的引用,这个想法根本没有任何意义。

您唯一的解决方案是以某种方式让您的IL执行对someMethodCall的调用。但是,如果不了解该方法的作用及其与生成类型的联系,就很难详细说明如何实现这一点。