2011-02-07 1 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, положить ParameterType на стек после OBJ а затем сделайте примерно следующее:

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

Обратите внимание, что castclass не обрабатывает типы значений. В этом случае вам нужен unbox, но вы должны быть осторожны, чтобы удалить бокс-значение как * точный тип *, в который он был помещен как. (Вы не можете, например, распаковать int как long.) 'ChangeType()' упростит это несколько за счет дополнительной операции box/unbox. (Если вы передадите в коробку int в 'ChangeType()' и запросите длинный, он распакует int, преобразует его в длинный, и поле, которое. Тогда вам придется распаковать длинный.) – cdhowie