构造 ArgumentException 时如何以编程方式确定参数名称?
-
01-07-2019 - |
题
构造 ArgumentException 时,一些重载采用一个字符串,该字符串是无效参数的参数名称。我认为每当我更改方法的参数名称时不必记住更新此 ctor 参数会很好。有没有一种简单的方法可以使用反射来做到这一点?
更新: 感谢到目前为止的 2 位受访者。你们都很好地回答了这个问题,但解决方案仍然让我感到头痛。(好吧,一个 微小的 头痛,但仍然......)解释一下,如果我要 重新排序 稍后的参数 - 或删除较早的参数 - 我必须记住再次更改我的异常构造代码。有没有办法我可以使用类似的东西
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 可能是执行此操作的最佳方法。
不隶属于 StackOverflow