按合同设计和一般例外

时间:2012-04-03 10:50:18

标签: c# asp.net exception design-by-contract

我正在实现一个非常简单的“按合同设计”静态助手类的早期过程,类似于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。

非常感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:2)

我相信你已经知道微软的Code Contracts支持了,但是如果你不是(并因此在不知不觉中重新发明轮子)你可以在这里找到它们:

http://research.microsoft.com/en-us/projects/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);