2017-06-15 73 views
-1

所以我有這樣的事情C#IL Emiter負載變量類型的對象

public void test(string name, Func<object> fuc) 
    { 
     object x = fuc(); 
     FieldInfo fdt = Dest.GetField(nameDest, BindingFlags.NonPublic | 
     BindingFlags.Public | BindingFlags.Instance); 

     ilGenerator.Emit(OpCodes.Ldarg_0); 
     ilGenerator.Emit(OpCodes.Ldfld, fieldBuilder); 

     //and here i want to load the x 

     ilGenerator.Emit(OpCodes.Stfld, fdt); 
    } 

有人可以幫助我PLZ?謝謝

+0

爲什麼你有這樣的事情? –

+0

爲什麼downvotes?這是一個常見的問題,雖然肯定是重複的,但有標誌。 – hoodaticus

+1

是否有一個原因,你不只是在運行時調用fuc()? – hoodaticus

回答

1

你不能。根據您生成的IL的方式和時間被調用,對象可能無法訪問(例如,您可以將IL保存到程序集並在單獨的進程中使用它)。

你需要的是一些可以恢復對象的代碼。如果只在當前進程/應用程序域中使用IL,則可以通過將對象保存到字段(可能是static之一)並加載該對象來完成此操作。

另一種選擇是使用某種序列化來保存對象,然後在IL中反序列化它,假定對象可以被序列化。

+0

此外,該靜態字段可以是字典,該鍵可以是一個用作對象ID的無鎖定遞增整數,並且該值可以是您需要的對象。這是可行的,因爲int可以在源代碼中進行硬編碼,與整個對象不同。所以你只需在編譯時將int鍵推入堆棧,然後調用字典的索引器來獲取對象。 – hoodaticus