2015-08-27 3 views
2

Я создаю репозиторий следующим образом:Как сделать метод возвратом универсального метода?

public class StagingRepository 
{ 
    private IRepository<CurrentTransformer> CurrentTransformerRepository { get; set; } 
    private IRepository<Equipment> EquipmentRepository { get; set; } 
    private IRepository<Line> LineRepository { get; set; } 
    public StagingRepository() 
    { 
     this.CurrentTransformerRepository = new Repository<CurrentTransformer>(); 
     this.EquipmentRepository = new Repository<Equipment>(); 
     this.LineRepository = new Repository<Line>(); 
    } 
} 

Все это работает ... Но то, что я пытаюсь добавить это метод в классе, который возвращает один из Хранилища выше на основе значения строки.

public IRepository<Object> SetRepo(string TableName) 
{ 
    switch (TableName) 
    { 
     case "Line": 
      return LineRepository; 
      break; 
    } 
} 

Я знаю, что вышеупомянутое не работает, но оно дает вам представление о том, чего я пытаюсь выполнить. Моя цель была бы я должен быть в состоянии установки что-то вроде этого в моем коде, чтобы позвонить в хранилище:

StagingRepository _repo = new StagingRepository(); 
var myList = _repo.SetRepo("Line").All(); //All is a function of IRepository 

Любая помощь будет принята с благодарностью.

ответ

3

Вы можете сделать IRepositorycovariant:

public interface IRepository<out T> 

Таким образом, вы всегда можете использовать IRepository<Derived> вместо IRepository<Base> при возврате из метода. В вашем случае, ваш код будет компилировать и работа:

public IRepository<object> SetRepo(string TableName) 
{ 
    switch (TableName) 
    { 
     case "Line": 
      return LineRepository; 
      break; 
    } 
} 

потому Line происходит от object, так что вы можете вернуться IRepository<Line> для IRepository<object>.

Это, однако, не будет работать, если вы используете T в качестве аргумента - тип не может быть как ковариантным, так и контравариантным. В этом случае рассмотрите возможность переноса не общих методов из IRepository<T> в не общую версию IRepository и сделайте ваши хранилища реализованы как. Таким образом, вы могли бы:

public IRepository SetRepo(string TableName) 
// ... 

Кстати, название SetRepo вводит в заблуждение - функция ничего не установлено, это скорее «получает» соответствующее хранилище.

+0

Думаю, я не уверен, что вы здесь говорите ... –

+0

@kevinc Я добавил дополнительные пояснения. Теперь нормально? – BartoszKP

+0

Я попытался поместить в IRepository , но это не позволит из-за того, что у меня есть другие методы, которые требуют T –

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