我正在实现一个非常简单的“按合同设计”静态助手类的早期过程,类似于NUnit的Assert
。理想情况下,我要做的是传入一个表达式,检查它是否为真,如果不是,则抛出任何参数或错误消息的特定异常。 在一个理想的世界中我会做这样的事情:
// ideal
Assert.True<ArgumentNullException>(user != null, "User", "User cannot be null");
// not so ideal
Assert.True(user != null, new ArgumentNullException("User", "User cannot be null");
现在,我的问题是,Assert.True<T>
上的约束将是Exception, new()
,以便我创建所需类型的新例外。我遇到的关键问题是,首先通用构造函数不允许参数,其次,Exception
构造函数上的大多数属性只是GET。
非常感谢任何帮助,谢谢。
答案 0 :(得分:2)
我相信你已经知道微软的Code Contracts支持了,但是如果你不是(并因此在不知不觉中重新发明轮子)你可以在这里找到它们:
答案 1 :(得分:1)
这样的事情怎么样:
Assert.True(user != null, () => new ArgumentNullException("User", "User cannot be null");
通过将异常的实例化委托给匿名方法,您只需在需要时构造异常。这也可以解决您在Assert
类中实例化异常的问题。
Assert.True
可能看起来像这样:
public static True(bool condition, Action<Exception> exception)
{
if(!condition) throw exception();
}
答案 2 :(得分:0)
感谢您的回答;我发现了System.Activator.CreateInstance
形式的轻微解决方法,在此处发现的非常类似的帖子中对此进行了讨论:Casting Exceptions in C#:
throw (T) System.Activator.CreateInstance(typeof(T), message, innerException);