2012-01-25 1 views
1

У меня есть метапрограмма, которая должна создать код для инициализации полей значений. I.e. имеют классОтражение излучение. Обобщение Ldc_R8 и Ldc_I4_0

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? Или мне нужен переключатель, упомянутый выше?

+0

Несомненно, 'float' не' R8'! Вы имели в виду 'double'? – leppie

+2

Вам понадобится гигантский переключатель, и, пожалуйста, разместите его здесь, где вы закончите, чтобы другие могли его использовать :) –

+0

Кстати, у вас есть только ограниченный диапазон, я не вижу проблемы с кодированием большого переключателя. Сделай это один раз, и все готово! – leppie

ответ

0

Оба поля и локальные переменные начинаются с нуля по умолчанию, поэтому вам, скорее всего, это не понадобится.

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

1
+0

Как я могу использовать деревья выражений для генерации библиотеки с динамически созданным кодом? – zabulus

+0

@zabulus С помощью метода 'CompileToMethod', но вы можете компилировать выражения только в' static'. Поэтому вы не можете использовать это для инициализации переменных. –

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^