3

ArgumentException を作成するときに、いくつかのオーバーロードが、無効な引数のパラメーター名である文字列を取ります。メソッドのパラメーター名を変更するたびに、この ctor パラメーターを更新することを覚えておく必要がないのはいいことだと思います。リフレクションを使用してこれを行う簡単な方法はありますか?

更新:これまでに 2 人の回答者に感謝します。あなたは両方とも質問によく答えますが、解決策はまだメンテナンスの頭痛の種です。(わかりました、ちょっとした頭痛ですが、それでも...)説明すると、後でパラメーターを並べ替える場合、または以前のパラメーターを削除する場合、例外構築コードを再度変更することを忘れないでください。の線に沿って何かを使用できる方法はありますか

Object.ReferenceEquals(myParam, <insert code here>)

関連するパラメータを扱っていることを確認するには?そうすれば、コンパイラが介入して、私が例外をひどく構築するのを防ぎます。

とは言っても、元の質問の「単純な」部分はそうではないのではないかと疑い始めています。たぶん、文字列リテラルの使用に我慢する必要があります。:)

4

2 に答える 2

2

反射はこれには適していません。

あなたはそれを正しく理解するために覚えておく必要があります。

幸いなことに、FxCop (または Team System Code Analysis) が不一致を指摘してくれます。

于 2008-09-18T18:27:09.423 に答える
2

これには式ツリーを使用できます。これにより、いくつかの奇妙な構文の費用がかかります。例えば

public void Resize(int newSize)
{
  if (newSize < 1)
  {
    throw new ArgumentException("Blah", NameOfVariable(() => newSize));
  }
  // ... whatever ...
}

NameOfVariable は次のように定義されます。

public static string NameOfVariable(Expression<Func<object>> expressionTree)
{
   var expression = (UnaryExpression)expressionTree.Body;
   var memberExpression = (MemberExpression)expression.Operand;
   return memberExpression.Member.Name;
}

UnaryExpression 以外のものを NameOfVariable に渡すと、実行時にクラッシュする可能性もあります。

このコードが FxCop に文句を言わせても驚かないでしょう。Joeが言及しているように、FxCop を使用することがおそらくこれを行う最良の方法です。

于 2008-12-22T10:11:40.023 に答える