Можно ли указать в ограничении универсального типа, что он должен реализовывать универсальный тип? - PullRequest
6 голосов
/ 16 марта 2011

Вот что я хотел бы сделать:

public interface IRepository<TSet<TElement>> where TSet<TElement> : IEnumerable<TElement>
{
    TSet<TEntity> GetSet<TEntity>();
}

Возможна ли такая конструкция в .NET?

Редактировать : Вопрос был недостаточно ясен,Вот что я хочу сделать в расширенном виде:

public class DbRepository : IRepository<DbSet<TElement>> {
    DbSet<TEntity> GetSet<TEntity>();
}

public class ObjectRepository : IRepository<ObjectSet<TElement>> {
    ObjectSet<TEntity> GetSet<TEntity>();
}

То есть я хочу, чтобы ограниченный тип: - принимал один универсальный параметр - реализовывал заданный интерфейс единого универсального параметра.

Isэто возможно?На самом деле, я буду счастлив только первым делом.

public interface IRepository<TGeneric<TElement>> {
    TGeneric<TArgument> GetThing<TArgument>();
}

Ответы [ 2 ]

5 голосов
/ 16 марта 2011

Для этого вам нужно использовать два универсальных типа, например:

public interface IRepository<TCollection, TItem> where TCollection : IEnumerable<TItem>
{
    TCollection GetSet<TItem>();  
}

(я предполагаю, что TEntity должно было быть TElement в оригинале ...)

При этом, скорее всего, лучше написать что-то вроде:

public interface IRepository<T>
{
    IEnumerable<T> GetSet<T>();  
}

Это было бы более распространенным способом выполнения вышесказанного.

0 голосов
/ 23 марта 2011

В конце концов, это кажется невозможным.

Наконец-то я решил эту проблему, определив собственный интерфейс:

публичный интерфейс IRepository { IMySet GetSet (); }

И я обернул DbSet и ObjectSet в объекты, реализующие эти интерфейсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...