3

我有一个 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(null),都会生成警告。在我的 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);

我没有收到关于合同不完整的警告。

那是我的问题,我希望它现在变得更清楚了。

谢谢。

4

1 回答 1

1

我认为您错过了界面上的 ContractClass 属性:

[ContractClass(typeof(C042_Model_Contracts)]
public interface IC042_Model 
{ 
    void Save(C042 entity); 
    void Delete(C042 entity); 
} 

这里有一个关于代码契约的很好的描述

于 2012-05-22T04:59:16.390 回答