Можно ли указать на общем ограничении типа, что он должен реализовать общий тип?

StackOverflow https://stackoverflow.com/questions/5327904

Вопрос

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

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>();
}

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

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

public interface IRepository<TGeneric<TElement>> {
    TGeneric<TArgument> GetThing<TArgument>();
}
Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

В конце концов, это невозможно.

Я наконец работал над этим, определив свой собственный интерфейс:

Публичный интерфейс IrePository {imyset getSet (); }

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top