2012-03-07 59 views
0

我正在創建一個動態類型,它有一個我想返回對象的方法。我無法理解如何實現這一點。這是我到目前爲止有:使用C#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; 
} 

回答

2

你有這樣一行:

Object myObjectIdLikeToReturn = someMethodCall(); 

你說你「想入堆棧參考myObjectIdLikeToReturn。」但那是不可能的。我認爲你在混淆這些事情發生的時機。 IL代碼類似於編譯 - 一切都需要靜態地知道。而myObjectIdLikeToReturn是在生成代碼時碰巧存在的變量,但對於實際生成的類沒有任何意義。你不能「烘烤」一些任意運行時對象的引用,這個想法根本沒有任何意義。

你唯一的解決方法是以某種方式讓你的IL執行調用someMethodCall。但是,如果不瞭解更多關於該方法存在的位置及其與生成類型的關聯的信息,則很難詳細說明如何完成該方法。