2011-02-07 65 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