我在C#中有一个MVVM项目,我想在其中使用代码契约。 所以这是我的情景: 接口:
public interface IC042_Model
{
void Save(C042 entity);
void Delete(C042 entity);
}
然后我有合同的抽象类:
[ContractClassFor(typeof(IC042_Model))]
internal abstract class C042_Model_Contracts : IC042_Model
{
public void Save(C042 entity)
{
Contract.Requires(entity != null);
}
public void Delete(C042_CondicaoPagamento entity)
{
Contract.Requires(entity != null);
}
}
在另一个项目中,我的模型实现了接口,如果我打电话 this.Save(空) 在任何方法中,都会生成警告。 在我的ViewModel中,如果我调用上面相同的方法:this.Save(null),不会生成警告,但是当我运行应用程序时,上面的行会引发一个Contract异常。
我的方法有什么问题吗?
提前致谢。
我做了另一个例子,我认为每个人都更容易理解:
我在类库项目中创建了以下类:
public static class StringExtensions
{
public static string TrimAfter(string value, string suffix)
{
Contract.Requires(suffix != (string)null);
Contract.Requires(!string.IsNullOrEmpty(suffix));
Contract.Requires(value != null);
var index = value.IndexOf(suffix);
if (index < 0)
return value;
return value.Substring(0, index);
}
}
当我从如下的WPF项目中调用它时:
CodeDigging.StringExtensions.TrimAfter(null, null);
我没有得到合同不是全场的警告。
这是我的问题,我希望它现在变得更加清晰。
感谢。
答案 0 :(得分:1)
我认为你错过了界面上的ContractClass属性:
[ContractClass(typeof(C042_Model_Contracts)]
public interface IC042_Model
{
void Save(C042 entity);
void Delete(C042 entity);
}
关于代码合同here
的描述很好