合同设计和一般例外情况

本文关键字:情况 合同 | 更新日期: 2023-09-27 18:29:54

我正处于实现一个非常简单的"契约设计"静态助手类的早期过程中,类似于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。

非常感谢您的帮助,谢谢。

合同设计和一般例外情况

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

http://research.microsoft.com/en-us/projects/contracts/

这样的东西怎么样:

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();
}

感谢您的回答;我发现了一个System.Activator.CreateInstance形式的小问题,这在这里的一篇非常相似的文章中进行了讨论:C#中的Casting Exceptions:

throw (T) System.Activator.CreateInstance(typeof(T), message, innerException);