2011-02-07 64 views
0

我目前正在嘗試擴展使用反射(ILGenerator)創建動態方法的現有應用程序。相當於Expression.Convert使用Reflection.Emit

我目前在堆棧上有一個對象,這個方法需要將對象轉換成與'parameterType'相同的類型。我想提供,我們使用Expression.Convert

public override void EmitParameterResolution(ILGenerator il, Type parameterType) 
{ 
    // il.Emit - Not sure what to do here... 
    // Expression.Convert(obj, parameterType) 
} 

回答

0

時得到相同的轉換功能你可能想Castclass

public override void EmitParameterResolution(ILGenerator il, Type parameterType) 
{ 
    il.Emit(OpCodes.Castclass, parameterType); 
} 

您可能還覺得只是Call,把參數類型OBJ後在堆棧上然後執行如下操作:

MethodInfo mi = typeof(Convert).GetMethod("ChangeType"); 
il.Emit(OpCodes.Call, mi); 
+1

請注意,castclass不處理值類型。在這種情況下,你需要unbox,但是你必須小心地將盒裝值作爲*確切類型*進行裝箱。 (舉例來說,你不能取消一個整型int。)`ChangeType()`會稍微簡化一下,以一個額外的box/unbox操作爲代價。 (如果你將一個盒裝的int傳遞給`ChangeType()`並請求一個long,它將取消這個int的裝箱,將它轉換爲一個long,然後將這個盒子解開。) – cdhowie 2013-06-10 16:37:45