我想使用抽象类将代码契约添加到通用接口,但是验证了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>
但我真的想保留这个。有可能吗?
答案 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);
}
}