Возможно ли, чтобы класс реализации определял общий параметр для интерфейса? Или, другими словами, вывести общий параметр из реализации?Общий интерфейс требует аргумента типа
В приведенном ниже примере я хочу иметь возможность использовать интерфейс репозитория независимо от Идентификатора типа 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.
Номера строк немного избыточны. –
'IRepository' имеет параметр' T'. Что именно вы ожидаете от компилятора? –
Не указано ли 'T' в строке 9? – JDawg