C# 自定义代码契约异常消息

C# 自定义代码契约异常消息,c#,exception,code-contracts,C#,Exception,Code Contracts,我有这样一个代码契约——它验证要存储的实体不是空的,并且对持久性有效。它起作用了。晶圆厂 [ContractClassFor(typeof(IRepository<,>))] internal abstract class ContractsForIRepository<T, TId> : IRepository<T, TId> where T : IEntity { private ContractsForIRepository() {

我有这样一个代码契约——它验证要存储的实体不是空的,并且对持久性有效。它起作用了。晶圆厂

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

}
[ContractClassFor(typeof(IRepository))]
内部抽象类ContractsForIRepository:IRepository,其中T:Entity
{
私有合同存储库()
{
} 
公共T持久化(T实体)
{
需要(实体!=null,“实体为null”);
Contract.Requires(entity.IsValidForPersistence(),“实体对持久性无效”);
返回默认值(T);
}
}
然而,我希望这个异常更加有用——因为任何接收到消息的人都希望知道哪个实体是无效的,以及它看起来是什么样子。所有实体都会覆盖ToString(),因此我希望在错误消息中包含以下内容:

Contract.Requires<InvalidEntityException>(entity.IsValidForPersistence(), "Entity not valid for persistence " + entity.ToString());
Contract.Requires(entity.IsValidForPersistence(),“entity对持久性无效”+entity.ToString());
我已经将ToString包含在显式中——如果我省略它,它将被隐式调用,但我认为它使我的问题更清楚

问题是,代码契约不允许这样做,我得到以下消息

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

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

根据:

2.10合同方法重载

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

Contract.Requires(x!=null,“如果x为null,则导弹为红色!”)

每当合同生效时,将显示用户提供的字符串 在运行时被违反当前,它必须是编译时常量


因此,您所要求的是不可能的。

因此,此消息
用户消息到合同调用只能是字符串文字、静态字段或至少在内部可见的静态属性。
似乎是一个明显的谎言…:s