2012-01-25 8 views
1

私は値フィールドを初期化するためのコードを作成する必要があるメタプログラムを持っています。 I.反射ではクラス反射発光。 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にemitコードを付けることができます。つまり、ダイナミックメソッドだけでなく、TypeBuilderで作成したメソッドを埋めるために使用できます。

関連する問題