C#, могу ли я объявить List‹MyInterface‹T›› интерфейса типа, который имеет общий тип T?

Я хочу сделать что-то, что я сделал на Java. У меня есть интерфейс с универсальным типом, например:

interface IDAO<T>
{
   void Save(T data);
}

И у меня есть два класса, которые реализуют этот интерфейс:

class BankAccountDAO : IDAO<BankAccount>
{
   public void Save(BankAccount data){...}
}

class CategoryDAO : IDAO<Category>
{
   public void Save(Category data) {...}
}

Мне нужен другой класс со списком, который должен быть объявлен типом IDAO с общим типом T, чтобы я мог добавить конкретные классы в этот список следующим образом:

class Manager
{
   private List<IDAO> daoList = new List<IDAO>(); // here is the error
   daoList.Add(new BankAccountDAO());
   daoList.Add(new CategoryDAO());

   public void myMethod(BankAccount b)
   {
      daoList.ElementAt(0).Save(b); // this should call the implemented Save() method of BankAccountDao
   }
}

Я сделал это на Java для проекта, но когда я пытаюсь сделать это на С#, я получаю сообщение об ошибке:

CS0305 C# Для использования универсального типа требуется 1 аргумент типа

Есть ли способ сделать что-то подобное?


person lele    schedule 16.01.2020    source источник
comment
Это потому, что в С# есть настоящие дженерики, а не поддельные, как в Java, поэтому IDAO<BankAccount> и IDAO<Category> - разные типы.   -  person Selvin    schedule 16.01.2020
comment
Почему не словарь? или что-то подобное, что используют DI... сначала зарегистрируйтесь как TypeFactory.Register<IDAO<BankAccount>, BankAccountDAO>() или TypeFactory.Register<IDAO<BankAccount>>(new BankAccountDAO()), затем используйте TypeFactory.Resolve<IDAO<BankAccount>>().Save(new BankAccount { ... })   -  person Selvin    schedule 17.01.2020


Ответы (1)


Вам нужно передать параметр типа IDAO в вашем классе Manager; для этого вам нужен тип, который объединяется с BankAccount и Category; если возможно, я бы объявил интерфейс с именем IBusinessObject, который реализуют Category и BankAccount:

class Manager
{
   private List<IDAO> daoList = new List<IDAO<IBusinessObject>>(); // add type parameter for IDAO
   daoList.Add(new BankAccountDAO());
   daoList.Add(new CategoryDAO());
   public void myMethod(IBusinessObject b) // has to be IBusinessObject; 
                                           //you'll need to cast the underlying 
                                       ///type to promote it to a BankAccount or Category.
   {
      daoList.ElementAt(0).Save(b); // this should call the implemented Save() method of BankAccountDao
   }
}
person gabriel.hayes    schedule 16.01.2020