2015-09-18 3 views
0

Возможно ли, чтобы класс реализации определял общий параметр для интерфейса? Или, другими словами, вывести общий параметр из реализации?Общий интерфейс требует аргумента типа

В приведенном ниже примере я хочу иметь возможность использовать интерфейс репозитория независимо от Идентификатора типа Entity.

1 class Entity<T>  // where id is either an int or Guid 
2 { 
3  public T Id { get; set; } 
4 } 

5 interface IRepository<T> 
6 { 
7  IEnumerable<Entity<T>> ListAll(); 
8 } 

9 class GuidRepository : IRepository<Guid>  // this repo deals with Guid type entities 
10 { 
11  public Entity<Guid> ListAll() 
12  { 
13   // list all entities 
14  } 
15 } 

16 class Program 
17 { 
18  private IRepository GetRepository(int someCriteria) 
19  { 
20   switch (someCriteria) 
21   { 
22    case 1: 
23     return new GuidRepository(); 
24    ... 
25   } 
26  } 

27  static void Main(string[] args) 
28  { 
29   Program p = new Program(); 
30   IRepository repo = p.GetRepository(1); 
31   var list = repo.ListAll(); 
32  } 
33 } 

Так как код стоит теперь, компилятор жалуется на линии 18 с указанием:

Using the generic type requires 1 type arguments 

В моем реальном проекте, метод вызова GetRepository это действие контроллера MVC, и поэтому не может определить тип параметра на уровне линии 16.

+0

Номера строк немного избыточны. –

+0

'IRepository' имеет параметр' T'. Что именно вы ожидаете от компилятора? –

+0

Не указано ли 'T' в строке 9? – JDawg

ответ

3

Можете ли вы обработать GenericClass<T> полиморфно с помощью GenericClass<Y>, где T и Y - это разные классы?

Нет. И это своего рода точка. Вам нужна безопасность типа между T и Y, что и предлагает Generics.

Я замечаю, что вы говорите, что можете печатать на консоли, что верно, потому что оба имеют методы ToString(). Если вам нужна коллекция объектов, у которых есть эта возможность, вы хотите GenericClass<object>.

IGenericInterface<N> Смешивание и IGenericInterface<M> под IGenericInterface<O> когда это N : O и M : O называется ковариации и is a bit complex, это интерфейс вещь is implemented when creating the interface.

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