3

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

更新:感谢到目前为止的 2 位受访者。你们都很好地回答了这个问题,但解决方案仍然让我很头疼。(好吧,有点头疼,但仍然......)解释一下,如果我稍后重新排序参数 - 或删除更早的参数 - 我必须记住再次更改我的异常构造代码。有没有办法我可以使用类似的东西

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

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

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

4

2 回答 2

2

反射不适用于此。

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

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

于 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 回答