2014-08-29 1 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 'на' Список '. Это невозможно. –

ответ

1

Вы не должны использовать общий аргумент TCollection. Использование общего аргумента - это способ сказать, что пользователь этого интерфейса должен иметь возможность определить, что это за тип, в этом случае какой тип возвращается этим методом.

Очевидно, что это проблема для вас. В ваших реализациях метода необходимо безоговорочно вернуть IEnumerable, а не неизвестный тип, указанный вызывающим. Просто удалите этот общий аргумент, чтобы выполнить это.

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

Но таким образом я могу указать интерфейс, который, как ожидается, вернет IQueryable, например. ленивая реализация репозитория. – xvdiff

+0

@xvdiff Затем определите его, чтобы вернуть 'IQueryable'. – Servy

Смежные вопросы