3

我想使用抽象类将代码合同添加到通用接口,但类型参数已验证。

这是我想做的一个例子:

[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>

但我真的很想保留这个。是否可以?

4

1 回答 1

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);
    }
}
于 2012-09-26T13:11:33.547 回答