1

这个让我难住了。我在合同适用的方法是接口实现的场景中使用代码合同。因此,我使用抽象的 ContractClassFor 方法来定义合同要求。这适用于其中一个实现类(它恰好与接口在同一个项目中),但合同永远不会应用于第二个实现(它在一个单独的项目中)。两个项目具有相同的代码合同设置(标准合同要求;完整的运行时合同检查)。这是代码中的场景:

namespace First.Interfaces {
    [ContractClass(typeof(ContractForIMyClass))]
    public interface IMyClass {
        void MyMethod(int id);
    }

    [ContractClassFor(typeof(IMyClass))]
    public abstract class ContractForIMyClass : IMyClass
    {
        void MyMethod(int id) {
            Contract.Requires<ArgumentException>(id != 0);
        }
    }
}

namespace First {
    public class MyClass : IMyClass {
        public void MyMethod(int id) {
            //contract is applied here
        }
    }
}

namespace Second {
    public class MyTestClass : IMyClass {
        public void MyMethod(int id) {
            //contract is not applied
        }
    }
}

任何想法都非常感谢。

4

1 回答 1

4

为此,您需要做两件事:

  1. 为包含接口的程序集构建合同引用程序集。
  2. 在构建包含第二个类的项目时使用该合同引用程序集。

这两个选项都可以从 Visual Studio 中各个项目的属性页面中的代码协定部分进行控制。(如果您在单个解决方案中使用标准项目引用,则一旦修复了 #1,您可能无需为 #2 做任何事情。)

于 2013-11-07T18:05:36.953 回答