2012-01-25 33 views
1

我有metaprogramm,需要爲初始化值字段創建代碼。 也就是說上課反射發射。推廣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'!你的意思是「雙」嗎? – leppie

+2

你需要巨型開關,請在這裏發佈它,以便其他人可以使用它:) –

+0

順便說一句,你只有一個有限的範圍來處理,我沒有看到編碼一個大開關的問題。做一次,你就完成了! – leppie

回答

0

默認情況下,字段和局部變量都從零開始,所以您可能不需要這個。

要將變量設置爲默認值,可以使用ldloca <variable>,然後使用initobj <type>initobj通常用於結構(C#中的default(MyStruct)),但它也應該用於基元類型。

1
+0

如何使用表達式樹來生成具有動態創建代碼的庫? – zabulus

+0

@zabulus使用'CompileToMethod'方法,但只能將表達式編譯爲'static'方法。所以你不能用它來進行變量初始化。 –

0

有沒有這樣的方法內置。你可以自己創建一個幫手,並且始終解決問題。

也就是說,您可以使用表達式樹並將代碼發射到您選擇的ILGenerator中。這意味着您不僅可以生成動態方法,而且可以使用它們來填充TypeBuilder創建的方法。