Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等效于表达式。使用反射转换。发射_C#_Reflection.emit - Fatal编程技术网

C# 等效于表达式。使用反射转换。发射

C# 等效于表达式。使用反射转换。发射,c#,reflection.emit,C#,Reflection.emit,我目前正在尝试扩展一个使用反射ILGenerator创建动态方法的现有应用程序 我当前在堆栈上有一个对象,此方法需要将该对象转换为与“parameterType”相同的类型。我想提供与使用Expression.Convert时相同的转换功能 public override void EmitParameterResolution(ILGenerator il, Type parameterType) { // il.Emit - Not sure what to do here...

我目前正在尝试扩展一个使用反射ILGenerator创建动态方法的现有应用程序

我当前在堆栈上有一个对象,此方法需要将该对象转换为与“parameterType”相同的类型。我想提供与使用Expression.Convert时相同的转换功能

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

您还可以考虑将parameterType放在obj之后的堆栈上,然后执行如下操作:

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

请注意,castclass不处理值类型。在这种情况下,需要取消装箱,但必须小心将装箱的值取消装箱,使其与装箱时的类型完全相同。例如,不能将int作为long取消装箱。ChangeType将在某种程度上简化此操作,但需要额外的box/unbox操作。如果您将一个装箱的int传递到ChangeType并请求一个long,它将取消装箱int,将其转换为long,然后将其装箱。然后你必须解开长的盒子。
MethodInfo mi = typeof(Convert).GetMethod("ChangeType");
il.Emit(OpCodes.Call, mi);