我定义了以下界面:
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}},这显然应该有效吗?我怎样才能实现我的目标?
答案 0 :(得分:1)
您不应该使用通用参数TCollection
。使用泛型参数是一种说法,该接口的用户应该能够定义该类型是什么,在这种情况下,此方法返回什么类型。
显然这对你来说是一个问题。您的方法实现需要无条件地返回IEnumerable
,而不是调用者指定的未知类型。只需删除该泛型参数即可实现此目的。
public interface IReadOnlyRepositoryBase<TEntity, TKey>
where TEntity : EntityBase<TKey>
{
IQueryable<TEntity> GetAll();
}