我發現我越來越「操作可能會破壞運行時」在DynamicMethod的我產生的原因,雖然我很容易固定它,它給我留下了一個看似簡單的問題:將對象投射到IL中的特定類中?
- 我怎麼投一個類型爲「Object」的對象引用爲特定的類型,這樣我可以在該對象引用上調用該類型的方法?
下面是一個示例程序。運行時,編譯該方法時會發生「操作可能會使運行時不穩定」異常。
該問題是通過更改被聲明爲TestClass
而不是Object
類型的變量的類型來解決的,但我仍想知道如何將引用轉換爲代碼中的相應類型。
在代碼中,我用asterixes標記了一行。我可以在那個時候發出什麼代碼,以便將堆棧中的Object
引用轉換爲TestClass
引用,以便方法調用能夠通過?
請注意,我知道這是產生問題的方法調用,如果我完全註釋掉這些行,那麼該變量的類型無關緊要,該方法會被編譯並執行正常。
這是代碼。
using System;
using System.Reflection.Emit;
namespace ConsoleApplication9
{
public class TestClass
{
public void TestMethod() { }
}
class Program
{
static void Main(string[] args)
{
Type type = typeof(TestClass);
DynamicMethod method = new DynamicMethod("", typeof(Object), null);
ILGenerator il = method.GetILGenerator();
LocalBuilder variable = il.DeclareLocal(typeof(Object));
// Construct object
il.Emit(OpCodes.Newobj, type.GetConstructor(new Type[0]));
il.Emit(OpCodes.Stloc, variable);
// Call Test method
il.Emit(OpCodes.Ldloc, variable);
// ***************************************** what do I do here?
il.Emit(OpCodes.Call, type.GetMethod("TestMethod"));
// Return object
il.Emit(OpCodes.Ldloc, variable);
il.Emit(OpCodes.Ret);
// Create and call delegate
Func<Object> fn = (Func<Object>)method.CreateDelegate(
typeof(Func<Object>));
Object instance = fn();
}
}
}
對不起,忽略你的答案這麼久,我的代碼中有一個錯誤,使得它看起來像Castclass不是正確的選擇,但是當我發現這一點時,我立即忘記了我的SO問題。感謝您的努力。 – 2009-10-30 17:33:01