使用C#OpCodes发出返回对象的方法

时间:2012-03-07 17:12:17

标签: c# reflection.emit object-reference opcodes

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

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

1 个答案:

答案 0 :(得分:2)

你有这一行:

Object myObjectIdLikeToReturn = someMethodCall();

你说你想要将myObjectIdLikeToReturn引用到堆栈上。"但这是不可能的。我认为你把这些事情发生的时机搞得一团糟。 IL生成代码类似于编译 - 所有内容都需要静态知道。而myObjectIdLikeToReturn是在生成代码时碰巧存在的变量,但对实际生成的类没有任何意义。你不能在"烘烤"对某个任意运行时对象的引用,这个想法根本没有任何意义。

您唯一的解决方案是以某种方式让您的IL执行someMethodCall的调用。但是,如果不了解该方法所处的位置及其与生成类型的关系,则很难详细说明您将如何实现该方法。