使用带有类型条件的通用接口的代码契约

时间:2012-09-26 13:09:14

标签: c# generics code-contracts

我想使用抽象类将代码契约添加到通用接口,但是验证了type参数。

以下是我想要做的一个例子:

[ContractClass(typeof(ContractsForIRepository<,>))]
public interface IRepository<T, in TId> where T : IEntity
{
    T GetById(TId id);
    T Persist(T entity);
    void Remove(TId id);
}

[ContractClassFor(typeof(IRepository<,>))]
internal abstract class ContractsForIRepository<T, TId> : IRepository<T, TId>
{
    public T GetById(TId id)
    {
        Contract.Requires(id != null);
        return default(T);
    }

    public T Persist(T entity)
    {
        Contract.Requires(entity != null);
        return default(T);
    }

    public void Remove(TId id)
    {
        Contract.Requires(id != null);
    }
}

我可以通过放弃条件轻松地使其工作:

  • public interface IRepository<T, in TId> where T : IEntity
  • public interface IRepository<T, in TId>

但我真的想保留这个。有可能吗?

1 个答案:

答案 0 :(得分:8)

好吧,它实际上是微不足道的 - 在抽象类上指定相同的条件!

以下完整示例。

[ContractClass(typeof(ContractsForIRepository<,>))]
public interface IRepository<T, in TId> where T : IEntity
{
    T GetById(TId id);
    T Persist(T entity);
    void Remove(TId id);
}

[ContractClassFor(typeof(IRepository<,>))]
internal abstract class ContractsForIRepository<T, TId> : IRepository<T, TId> where T : IEntity
{
    public T GetById(TId id)
    {
        Contract.Requires(id != null);
        return default(T);
    }

    public T Persist(T entity)
    {
        Contract.Requires(entity != null);
        return default(T);
    }

    public void Remove(TId id)
    {
        Contract.Requires(id != null);
    }
}