2009-09-01 11 views
1

スイッチのすべてのケースをプログラムで取得できますか?私は多分ILではありませんが、どのように行うかわからない...C#スイッチのケースを繰り返す

実際に私のグローバルな問題は次のとおりです:私はプロパティ名として文字列のsiwtchの場合があります。この方法は非常に重要であり、回帰は許されません。私はリファクタリングがこれを中断したくないので、すべての大文字小文字が実際に私のオブジェクトの本当のプロパティであることをテストするメソッドが必要です。 (注:デフォルト値は何かを返すので、リファクタリングされた無効な値の例外をスローすることはできません)。

+0

あなたのビルドプロセスの一環としてこのチェックを実行するつもりですか? –

+0

いいえ私はそれをクラスの静的コンストラクタに追加するか、明示的に呼び出すことを望みましたが、ビルドプロセス中にそれを行うと想像することができます。 – Toto

答えて

2

プロパティ名をコード内で直接文字列として使用しないようにする方法があります。コードスニペットhereを投稿しました。

その後、代わりにswitch文を使用するのでは、このような何かを実装:あなたは、両方のメソッドを呼び出すときは、コードスニペットのメンバークラスを使用していることを確認してください、

private IDictionary<string, Action> _actions; 

public void RegisterAction(string propertyName, Action action) 
{ 
    _actions.Add(propertyName, action); 
} 

public void DoSomething(string propertyName) 
{ 
    _actions[propertyName](); 
} 

(リンクを参照)の代わりに使用してのプロパティ名を直接指定します。だから、あなたのコードは、 "マジックストリング"を含んでいないので、あなたのコードはリファクタリング不可能であることを確かめることができます。

ILで

よろしく

+0

最後に、リンクされたポストに表示されたコードと辞書として提案されているように、thx! – Toto

1

スイッチで値を取得することは些細なことではないでしょう...

あなたは文字列の代わりにスイッチで列挙型を使用する場合は、あなたが簡単にEnum.GetValuesを使用して列挙型の値を取得することができます。

2

を、switch文は次のようなものにコンパイル:

// ... 
L_000c: ldloc.1 
L_000d: ldstr "case1" 
L_0012: call bool [mscorlib]System.String::op_Equality(string, string) 
L_0017: brtrue.s L_0035 
L_0019: ldloc.1 
L_001a: ldstr "case2" 
L_001f: call bool [mscorlib]System.String::op_Equality(string, string) 
L_0024: brtrue.s L_0042 
L_0026: ldloc.1 
L_0027: ldstr "case3" 
L_002c: call bool [mscorlib]System.String::op_Equality(string, string) 
L_0031: brtrue.s L_004f 
// ... 

すべての場合にこれを適切に分析することができ、コードを書くことが仕事のかなりの量になります。

これをテストする唯一の方法は、実際にすべてのケースをカバーし、nullのPropertyInfoで終わらないようにすることです。作業しているコードが非常に重要で失敗することができない場合は、どのような場合でもリフレクションを使用するのはおそらくかなり危険です。タイプセーフなデザインに移行できますか?

+0

そしてスイッチが大きくなると、C#コンパイラはスイッチの実装としてハッシュテーブルを生成します。実際にはILではあまり役に立ちません:) –

+0

逆に、スイッチが小さくなければ、ハッシュテーブル - 下の私の答えを見てください。 –

+0

確かに私はそれをするのは簡単だとは思わなかった。実際には、コードは例外をスローすることができます、私はそれがプロパティとして無効な文字列で大丈夫にしたくありません。 – Toto

0

AWKまたはPerlなどのスクリプトを作成してソース自体をチェックし、ビルドする前に実行します。

関連する問題