构造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可能是做到这一点的最佳方法。