违反以下合同时:
Contract.Requires<CustomException>(arg1 != null, "arg1 cannot be null");
CustomException.Message
中的消息变为:前提条件失败:arg1!= null arg1不能为空。在这种情况下,如何防止代码合同将“前提条件失败:arg1!= null ”添加到CustomException.Message
?
我的程序集正在使用代码契约的“标准契约需求”模式(code contract's user manual的第5.1节中的用法2)因为我想在发布版本中使用合同进行公共方法的参数验证,因此我' m使用Contract.Requires<T>
(带有type参数)。在这种情况下,我似乎无法访问我的“arg1不能为空”消息。我不想尝试删除“Precondition failed etc.”使用字符串操作。
我知道如果我改为抛出ContractException
(使用非通用Contract.Requires
),我可以使用反射从ContractException.UserMessage
获取我的消息。但是我不相信这些合同在使用“标准合同要求”模式时会起作用,而且无论如何我都无法全局发现这些错误。
答案 0 :(得分:2)
Code Contracts User Manual(第5.1.2节,第21页)暗示这是预期的行为:
RequiresExn(...)旨在与工具支持一起使用,意思是 它们在所有构建中继承,消息字符串是 自动生成以包含失败的条件
它没有提到要覆盖自动生成的消息,所以我认为不能。但是,作为解决方法,可以创建自定义合约运行时类(请参阅第7节,特别是用户手册的第7.7节),它会重写Requires<Ex>
,以便根据需要设置Exception.Message
。 / p>