0

我正在创建一个动态类型,它有一个我想返回一个对象的方法。我无法理解如何实现这一目标。这是我到目前为止所拥有的:

// .. 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;
}
4

1 回答 1

2

你有这一行:

Object myObjectIdLikeToReturn = someMethodCall();

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

您唯一的解决方案是以某种方式让您的 IL 执行对someMethodCall. 但是,如果不了解更多关于该方法所在的位置以及它与您生成的类型的联系,就很难准确地详细说明您将如何实现这一点。

于 2012-03-07T17:17:56.687 回答