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

时间:2020-03-06 14:22:19  来源:igfitidea点击:

构造ArgumentException时,几个重载采用一个字符串,该字符串是无效参数的参数名称。我认为,每当我更改方法的参数名称时,都不必记住要更新此ctor参数,那就很好了。有使用反射的简单方法吗?

更新:感谢到目前为止的两个答复者。你们都很好地回答了这个问题,但是解决方案仍然让我头疼。 (好吧,有点头疼,但仍然...)要说明一下,如果我以后要对参数进行重新排序-或者删除较早的参数-我必须记得再次更改我的异常构造代码。有没有办法我可以按照以下方式使用某些东西

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

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

就是说,我开始怀疑原始问题的"简单"部分不会出现。也许我应该忍受使用字符串文字。 :)

解决方案

反思不适合这样做。

我们必须忍受正确的记忆。

幸运的是,FxCop(或者团队系统代码分析)将指出所有不匹配之处,从而为我们提供帮助。

我们可以为此使用表达式树,这将使我们以某种奇特的语法昂贵的价格得到想要的东西。例如。

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抱怨,我不会感到惊讶,正如乔提到的使用FxCop可能是做到这一点的最佳方法。