我正在创建一个动态类型,它有一个我想要返回一个对象的方法。我无法理解如何实现这一目标。这就是我到目前为止所拥有的:
// .. 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;
}
答案 0 :(得分:2)
你有这一行:
Object myObjectIdLikeToReturn = someMethodCall();
你说你想要将myObjectIdLikeToReturn
引用到堆栈上。"但这是不可能的。我认为你把这些事情发生的时机搞得一团糟。 IL生成代码类似于编译 - 所有内容都需要静态知道。而myObjectIdLikeToReturn
是在生成代码时碰巧存在的变量,但对实际生成的类没有任何意义。你不能在"烘烤"对某个任意运行时对象的引用,这个想法根本没有任何意义。
您唯一的解决方案是以某种方式让您的IL执行someMethodCall
的调用。但是,如果不了解该方法所处的位置及其与生成类型的关系,则很难详细说明您将如何实现该方法。