从合同例外中删除语法

Remove syntax from contract exceptions

当违反以下约定时:

Contract.Requires<CustomException>(arg1 != null, "arg1 cannot be null");

CustomException.Message 中的消息变为:前提条件失败:arg1 != null arg1 不能为 null。在这种情况下,如何防止代码合同将“Precondition failed: arg1 != null”添加到 CustomException.Message?

我的程序集正在使用代码契约的 "standard contract requires" 模式(code contract's user manual 第 5.1 节中的用法 2),因为我想在发布版本中使用契约对 public 方法进行参数验证,因此我使用 Contract.Requires<T> (带有类型参数)的原因。在这种情况下,我似乎无法单独访问我的 "arg1 cannot be null" 消息。我不想尝试使用字符串操作来删除 "Precondition failed etc."。

我知道如果我改为抛出 ContractException(使用非泛型 Contract.Requires),我可以使用反射从 ContractException.UserMessage 获取消息。但我不相信这些合同在使用 "standard contract requires" 模式时会起作用,而且无论如何我都无法全局捕获这些错误。

Code Contracts User Manual(第 5.1.2 节第 21 页)暗示这是预期的行为:

RequiresExn(...) is intended to be used with tool support, meaning that they are inherited in all builds and the message strings are generated automatically to include the failing condition

它没有提到要覆盖自动生成的消息,所以我认为不能。但是,作为一种变通方法,可以创建一个自定义合约运行时 class(请参阅第 7 节,特别是用户手册的第 7.7 节)重写 Requires<Ex> 以便它设置 Exception.Message根据需要。