C# 等效于表达式。使用反射转换。发射
我目前正在尝试扩展一个使用反射ILGenerator创建动态方法的现有应用程序 我当前在堆栈上有一个对象,此方法需要将该对象转换为与“parameterType”相同的类型。我想提供与使用Expression.Convert时相同的转换功能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...
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);