无法将IEnumerable <tentity>转换为TCollection </tentity>

时间:2014-08-29 15:01:58

标签: c# linq generics collections repository

我定义了以下界面:

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>的{​​{1}},这显然应该有效吗?我怎样才能实现我的目标?

1 个答案:

答案 0 :(得分:1)

您不应该使用通用参数TCollection。使用泛型参数是一种说法,该接口的用户应该能够定义该类型是什么,在这种情况下,此方法返回什么类型。

显然这对你来说是一个问题。您的方法实现需要无条件地返回IEnumerable,而不是调用者指定的未知类型。只需删除该泛型参数即可实现此目的。

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