Можно ли указать на общем ограничении типа, что он должен реализовать общий тип?
-
26-10-2019 - |
Вопрос
Вот что я хотел бы сделать:
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
В объектах реализуют эти интерфейсы.