2

我有一个这样表达的代码合同 - 它验证要存储的实体不为空并且对持久性有效。有用。晶圆厂。

[ContractClassFor(typeof(IRepository<,>))]
internal abstract class ContractsForIRepository<T, TId> : IRepository<T, TId> where T : IEntity
{
    private ContractsForIRepository()
    {

    } 

    public T Persist(T entity)
    {
        Contract.Requires<InvalidEntityException>(entity != null, "Entity is null");
        Contract.Requires<InvalidEntityException>(entity.IsValidForPersistence(), "Entity not valid for persistence");
        return default(T);
    }

}

但是,我希望异常更有用——因为任何接收到消息的人都想知道哪个实体无效以及是什么样子。所有实体都覆盖 ToString(),所以我想将其包含在错误消息中:

Contract.Requires<InvalidEntityException>(entity.IsValidForPersistence(), "Entity not valid for persistence " + entity.ToString());

我已将 ToString 包括在内以明确表示 - 如果我省略它,它将被隐式调用,但我认为它使我的问题更清楚。

问题是,代码合同不允许这样做,我收到以下消息。

合同调用的用户消息只能是字符串文字、静态字段或至少在内部可见的静态属性。

有没有办法在异常消息中包含特定数据?

4

1 回答 1

2

根据文档

2.10 合约方法的重载

所有的契约方法都有重载,除了布尔条件之外还接受一个字符串:

Contract.Requires(x != null, "If x is null, then the missiles are red!");

只要在运行时违反合同,就会显示用户提供的字符串。目前,它必须是编译时常量

所以,你问的是不可能的。

于 2012-09-27T09:46:10.350 回答