我想使用CodeContracts来验证通用接口的一些特定实现。我有一个基本的通用接口
public interface IEnityMap<in TSource,out TDest>
{
TDest Map(TSource);
}
我想确定一些特定接口的CodeContracts。我想做这样的事情:
[ContractClass(typeof(ContractClass))]
public interface ISpecific: IEntityMap<SourceClass,DestClass>{}
[ContractClassFor(typeof(ISpecific))]
public abstract class ContractClass: ISpecific
{
public DestClass Map(SourceClass source)
{
Contract.Requires(source.SomeProperty!= null);
//Other checks
return default(DestClass);
}
}
我的Mapping类实现了泛型接口- IEntityMap<,>(不是isspecific),这个契约不起作用
正如我从您的代码示例中理解的那样,您派生出一个更专业的接口,其中您有比通用接口更多的约束。根据文档(以及底层的Liskov替换原则),在子类或更专门化的接口中不允许有更多的约束。
你应该得到一个类似
的错误"... implements interface method ... thus cannot add Requires"
您可以做的是尝试将类型强制转换为您的特定类型,然后在派生(抽象)基类中断言您的特定实现。但是,根据传递的值而使接口的行为不同可能容易出错,并导致意外的运行时错误。
问候,罗纳德。