ОтражениеОбобщая Ldc_R8 и Ldc_I4_0 - PullRequest
1 голос
/ 25 января 2012

У меня есть метапрограмма, которая должна создать код для инициализации полей значений.Т.е. есть класс

class Class1
{
    int i;
    double t;
    Class1()
    {
       i=5;
       t=3;
    }
} 

В отражении это выглядит следующим образом:

...
gen.Emit(OpCodes.Ldc_I4,5);
...
gen.Emit(OpCodes.Ldc_R8,3);
...

Я не хочу иметь такой огромный переключатель:

switch(t)
{
case typeof(int): gen.Emit(OpCode.Ldc_I4,value); break;
case typeof(double): gen.Emit(OpCodes.Ldc_R8,value); break;
// and so on for all value types
}

Есть ли какое-то универсальное значение нагрузки в OpCode стека оценки?Или мне нужен переключатель, упомянутый выше?

Ответы [ 3 ]

1 голос
0 голосов
/ 26 января 2012

По умолчанию поля и локальные переменные начинаются с нуля, поэтому вам, вероятно, это не нужно.

Для установки значения переменной по умолчанию вы можете использовать ldloca <variable>, за которым следует initobj <type>. initobj обычно используется для структур (default(MyStruct) в C #), но он также должен работать для примитивных типов.

0 голосов
/ 26 января 2012

Нет такого встроенного метода.Вы можете создать помощника самостоятельно и решить проблему навсегда.

При этом вы можете использовать деревья выражений и использовать код emit в ILGenerator по вашему выбору.Это означает, что вы можете генерировать не только динамические методы, но и использовать их для заполнения методов, созданных TypeBuilder.

...