2014-08-29 52 views
0

我已經定義了以下接口:無法IEnumerable的<TEntity>轉換爲TCollection

public interface IReadOnlyRepositoryBase<TEntity, TKey, TCollection> 
    where TEntity : EntityBase<TKey> 
    where TCollection: IEnumerable<TEntity> 

{ 
    TCollection GetAll(); 
} 

public interface IReadOnlyRepository<TEntity, TKey> : 
    IReadOnlyRepositoryBase<TEntity, TKey, IEnumerable<TEntity>> 
    where TEntity : EntityBase<TKey> 
{ } 

// there is also "ILazyReadOnlyRepository" where TCollection 
// is IQueryable<T>.. 

現在,我不能在我的實現返回IEnumerable<TEntity>因爲IEnumerable<TEntity>似乎並不可轉換爲TCollection

// basic repository impl for NHibernate 
public abstract class NHibernateReadOnlyRepositoryBase<TEntity, TKey, TCollection> 
    : IReadOnlyRepositoryBase<TEntity, TKey, TCollection> 
    where TEntity : EntityBase<TKey> 
    where TCollection : IEnumerable<TEntity> 
{ 

    public TCollection GetAll() 
    { 
      // doesn't work... 
      return _session.QueryOver<TEntity>().List(); 
    }  

至於我可以看到,該方法返回一個IList<T>它實現IEnumerable<T>,所以這顯然應該工作?我怎樣才能達到我想要的?

+0

應該如何工作? 'TCollection'也可以是'List ',在這種情況下,你可以將'IList '投射到'List '。那是不可能的。 – 2014-08-29 15:28:04

回答

1

您不應該使用通用參數TCollection。使用泛型參數是一種說法,即此接口的用戶應該能夠定義該類型是什麼類型,在這種情況下,此方法返回的是哪種類型。

顯然這對你來說是一個問題。您的方法實現需要無條件返回IEnumerable,而不是調用者指定的未知類型。只要刪除該通用參數即可完成該操作。

public interface IReadOnlyRepositoryBase<TEntity, TKey> 
    where TEntity : EntityBase<TKey> 
{ 
    IQueryable<TEntity> GetAll(); 
} 
+0

但是這樣我可以指定一個接口,這個接口可以返回一個IQueryable接口。懶惰的存儲庫實現。 – xvdiff 2014-08-29 15:15:32

+0

@xvdiff然後將其定義爲返回'IQueryable'。 – Servy 2014-08-29 15:16:05

相關問題