Size: a a a

2019 November 29

SB

Sergey Benzenko in CODE BLOG / C#
Никита Петроченко
не, он хочет другое. Если в метод засунуть первый интерфейс, то вернуть класс который реализует первый интерфейс.
Если засунуть второй интерфейс, то вернуть другой класс который реализует воторой интерфейс.
Чувствуешь подвох?
Ну мне на ум приходит только по названию проверять. А как иначе догадаться, какой класс к интерфейсу подобрать, я не знаю
источник

НП

Никита Петроченко... in CODE BLOG / C#
Gennady Kurbesov
очень грубо, чувак
Да потому что твоя задача в принцыте тупо поставлена и в реалиях не реализуема, потому что не понимаешь сути работы Generic методов.
Иди почитай про DI и контейнеры. Это идеально для тебя
источник

НП

Никита Петроченко... in CODE BLOG / C#
Sergey Benzenko
Ну мне на ум приходит только по названию проверять. А как иначе догадаться, какой класс к интерфейсу подобрать, я не знаю
да это невозможно, комон
источник

НП

Никита Петроченко... in CODE BLOG / C#
@gkurbesov про контейнера это не стеб, загугли windsorcontainer
источник

EA

Egene Avdeev in CODE BLOG / C#
Gennady Kurbesov
Все верно
Значит не нужны тебе дженерики, если логика такая
источник

EA

Egene Avdeev in CODE BLOG / C#
Gennady Kurbesov
нужно, что бы метод вернул объект, который реализует функционал указанного интерфейса (если такой был создан при инициализации) либо null
Фабрика или провайдер тебе нужен, а при создании иметь репозиторий, который содержит все объекты. Но это логика контейнеров, Autofac для примера можно попробовать, на метаните есть примеры кода
источник

SB

Sergey Benzenko in CODE BLOG / C#
Аж даже интересно стало. У меня вот такой костыль получился))) Но GetData должен возвращать object. А потом его надо приводить:

class Program
{
   static void Main()
   {
       var manager = new Manager();
       var service = (IService1) manager.GetData<IService1>();
   }
}

public class Manager
{
   public object GetData<T>() where T : class
   {
       switch (typeof(T).ToString())
       {
           case "IService1":
               return new Worker1();
           case "IService2":
               return new Worker2();
           default:
               return null;
       }    
   }
}
источник

SB

Sergey Benzenko in CODE BLOG / C#
Sergey Benzenko
Аж даже интересно стало. У меня вот такой костыль получился))) Но GetData должен возвращать object. А потом его надо приводить:

class Program
{
   static void Main()
   {
       var manager = new Manager();
       var service = (IService1) manager.GetData<IService1>();
   }
}

public class Manager
{
   public object GetData<T>() where T : class
   {
       switch (typeof(T).ToString())
       {
           case "IService1":
               return new Worker1();
           case "IService2":
               return new Worker2();
           default:
               return null;
       }    
   }
}
Не, точнее даже не приводить, а через is проверять потом надо.
источник

GK

Gennady Kurbesov in CODE BLOG / C#
Sergey Benzenko
Аж даже интересно стало. У меня вот такой костыль получился))) Но GetData должен возвращать object. А потом его надо приводить:

class Program
{
   static void Main()
   {
       var manager = new Manager();
       var service = (IService1) manager.GetData<IService1>();
   }
}

public class Manager
{
   public object GetData<T>() where T : class
   {
       switch (typeof(T).ToString())
       {
           case "IService1":
               return new Worker1();
           case "IService2":
               return new Worker2();
           default:
               return null;
       }    
   }
}
да, тоже думал о подобном, но просто хотел избавится от дальнейшего приведения объекта к определенному типу
источник

SB

Sergey Benzenko in CODE BLOG / C#
Gennady Kurbesov
да, тоже думал о подобном, но просто хотел избавится от дальнейшего приведения объекта к определенному типу
Возвращать T не даёт, даже внутри switch не даёт привести результат к T. Безопасность типов - нашевсё
источник

НП

Никита Петроченко... in CODE BLOG / C#
Gennady Kurbesov
да, тоже думал о подобном, но просто хотел избавится от дальнейшего приведения объекта к определенному типу
ну если сам хочешь запилить, то лан, подскажу )
Делаешь класс, в нем пилишь два метода и словарь. В словарь <Type, Type>,
Первый метод регает класс, ничего не возвращает, дженерик, во входных параметрах T.
У т берешь тип, и у входного параметра тоже тип и пихаешь в словарь.
Далее во втором методе делаешь T Get<T>
при вызове метода идешь в словарь то тайпу находишь второй тайп, получаешь его констурктор, вызываешь, кастишь к T и все
источник

НП

Никита Петроченко... in CODE BLOG / C#
но легче юзнуть контейнер и все
источник

GK

Gennady Kurbesov in CODE BLOG / C#
Никита Петроченко
но легче юзнуть контейнер и все
т.к. с контейнерами раньше не работал сразу встанет вопрос при использовании готовых контейнеров: как быть если классы должны будут создаваться/редактироваться/удаляться налету
источник

НП

Никита Петроченко... in CODE BLOG / C#
Gennady Kurbesov
т.к. с контейнерами раньше не работал сразу встанет вопрос при использовании готовых контейнеров: как быть если классы должны будут создаваться/редактироваться/удаляться налету
во время регистрации можно выбрать  жизненный цикл  объекта
источник

GK

Gennady Kurbesov in CODE BLOG / C#
Каждый класс будет реализовавывать функционал TCP сервера для интеграции железа, которое будет передавать данные каждый в своём протоколе.  Пользователи могут в любой создать новый сервер, изменить порт для прослушивания или удалить его
источник

НП

Никита Петроченко... in CODE BLOG / C#
Динамики плохо )
источник

GK

Gennady Kurbesov in CODE BLOG / C#
но тут динамика необходима
источник

SB

Sergey Benzenko in CODE BLOG / C#
C dynamic работает

class Program
{
   static void Main()
   {
       var manager = new Manager();
       var service = manager.GetData<IService1>();
       if (service is IService1)
       {
           Console.WriteLine("Service1");
       }

       Console.ReadLine();
   }
}

public class Manager
{
   public T GetData<T>() where T : class
   {
       dynamic worker;
       switch (typeof(T).Name)
       {
           case "IService1":
               worker = new Worker1();
               return (T)worker;
           case "IService2":
               worker = new Worker2();
               return (T) worker;
           default:
               return null;
       }
   }
}
источник

GK

Gennady Kurbesov in CODE BLOG / C#
+ параметры всех созданных серверов должны будут сохраняться и при перезапуске приложения - создаваться автоматом
источник

НП

Никита Петроченко... in CODE BLOG / C#
Gennady Kurbesov
Каждый класс будет реализовавывать функционал TCP сервера для интеграции железа, которое будет передавать данные каждый в своём протоколе.  Пользователи могут в любой создать новый сервер, изменить порт для прослушивания или удалить его
И чем тебе контейнер не подходит?
источник