如何在构造ArgumentException时以编程方式确定param名称?

时间:2008-09-18 16:39:05

标签: .net reflection refactoring duplication

构造ArgumentException时,一些重载采用的字符串是无效参数的参数名称。我认为每当我更改方法的参数名称时,不必记住更新此ctor参数会很好。有没有一种简单的方法可以使用反射来做到这一点?

更新:感谢目前为止的2位受访者。你们都很好地回答了这个问题,但解决方案仍然让我头疼。 (好吧,微小头痛,但仍然......)要解释一下,如果我以后重新订购 params - 或删除之前的参数 - 我会必须记住再次更改我的异常构造代码。有没有办法可以按照

的方式使用
Object.ReferenceEquals(myParam, <insert code here>)

确定我正在处理相关参数?这样,编译器会介入以防止我严重构造异常。

那就是说,我开始怀疑原始问题的“简单”部分不是即将发生的。也许我应该忍受使用字符串文字。 :)

2 个答案:

答案 0 :(得分:2)

反思不适合这个。

你必须忍住记住才能把它弄好。

幸运的是,FxCop(或团队系统代码分析)将通过指出任何不匹配来帮助您。

答案 1 :(得分:2)

你可以使用一个表达式树,这将让你想要一些奇怪的语法昂贵。 E.g。

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可能是最好的方法。