2011-02-07 8 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値をunboxするには注意が必要です。 (例えばintを長いものとしてunboxすることはできません) 'ChangeType()'はこれを幾分単純化します。余分なbox/unboxオペレーションを犠牲にします。 (BoxType intを 'ChangeType()'に渡してlongを要求すると、intをunboxし、longとboxに変換します。次にlongをunboxする必要があります)。 – cdhowie

関連する問題