构造 ArgumentException 时如何以编程方式确定参数名称?
Posted
技术标签:
【中文标题】构造 ArgumentException 时如何以编程方式确定参数名称?【英文标题】:How to programmatically determine param name when constructing an ArgumentException? 【发布时间】:2010-09-10 18:59:09 【问题描述】:在构造 ArgumentException 时,一些重载采用一个字符串,该字符串是无效参数的参数名称。我认为,每当我更改方法的参数名称时,不必记住更新此 ctor 参数会很好。有没有一种使用反射的简单方法来做到这一点?
更新:感谢迄今为止的 2 位受访者。你们都很好地回答了这个问题,但解决方案仍然让我很头疼。 (好吧,一个微小的头痛,但仍然......)解释一下,如果我要重新排序参数稍后 - 或删除更早的参数 - 我会必须记住再次更改我的异常构造代码。有没有办法我可以使用类似的东西
Object.ReferenceEquals(myParam, <insert code here>)
确定我正在处理相关参数?这样,编译器会介入以防止我错误地构造异常。
也就是说,我开始怀疑原始问题的“简单”部分并没有那么快。也许我应该忍受使用字符串文字。 :)
【问题讨论】:
【参考方案1】:反射不适合这个。
你将不得不忍受记住做对的事情。
幸运的是,FxCop(或团队系统代码分析)将通过指出任何不匹配来帮助您。
【讨论】:
很公平 - 我不确定,因为我之前几乎没有接触过反射。 FxCop 方面的好建议。谢谢。 :)【参考方案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 可能是最好的方法。
【讨论】:
以上是关于构造 ArgumentException 时如何以编程方式确定参数名称?的主要内容,如果未能解决你的问题,请参考以下文章
我在尝试打开/显示新表单时有时会收到 ArgumentException 参数无效,为啥?
PictureBox 在选项卡按键时抛出“参数无效”ArgumentException
使用 Graphics.GetHdc 时,System.Drawing.dll 引发了“System.ArgumentException”类型的未处理异常
SourceTree推送分支时遇到ArgumentException encountered错误的解决办法
如果引发 System.ArgumentException,如何将数据框行传递给 API?
RichTextBox.RTF 设置器抛出 System.ArgumentException。文件格式在 Windows 版本 1803 中无效