2012-09-26 82 views
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>

但我真的想保留這一點。可能嗎?

回答

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); 
    } 
} 
+1

我還沒有已知的對空屬性類型說明符('[ContractClass(typeof運算(ContractsForIRepository <,>))] '和'[ContractClassFor(typeof運算(IRepository <,>))]'。 –

+0

當我設置「堅持(T實體)」方法的斷點不會中斷,爲什麼? – barteloma

相關問題