2011-02-07 3 views
0

현재 리플렉션 (ILGenerator)을 사용하여 동적 메서드를 만드는 기존 응용 프로그램을 확장하려고합니다.Reflection.Emit을 사용하는 Expression.Convert와 같습니다.

현재 스택에 개체가 있습니다.이 메서드는 'parameterType'과 같은 형식으로 개체를 변환해야합니다. 나는 당신은 아마 Castclass 원하는 Expression.Convert

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

답변

0

를 사용할 때 우리가 얻을 같은 변환 기능을 제공 할 :

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

또한, 단지 Call 생각 OBJ 후 스택에 parameterType을 넣을 수 다음과 같이하십시오.

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

castclass는 값 유형을 처리하지 않습니다. 이 경우에는 unbox가 필요하지만 boxed 값을 * 정확한 유형 *으로 상자에 넣지 않도록주의해야합니다. (예를 들어 long을 int로 unbox 할 수는 없습니다.)'ChangeType()'은 상자/unbox 추가 작업을 희생시키면서 다소 간소화합니다. (박스형 int를'ChangeType()'에 전달하고 long을 요청하면, int를 unbox하고, long으로 변환하고 상자에 넣습니다. 그러면 long을 unbox해야합니다.) – cdhowie

관련 문제