Обработчик интерфейса любого T типа

Рейтинг: 1Ответов: 1Опубликовано: 06.06.2023
public interface IFoo<T> { }
public class FooStr : IFoo<string> { }
public class FooInt : IFoo<int> { }
public class FooObj : IFoo<object> { }
public class FooHandler<T> where T : IFoo<...> { } // ???
...
FooHandler<FooStr> fooHandlerStr = new FooHandler<FooStr>();
FooHandler<FooInt> fooHandlerInt = new FooHandler<FooInt>();
FooHandler<FooObj> fooHandlerObj = new FooHandler<FooObj>();

Как написать класс, T которого IFoo<> с любым U?

Ответы

▲ 1Принят

Ответ на англоязычном stack: C# generic "where constraint" with "any generic type" definition?

Спасибо @AlexanderPetrov.


public interface IFoo { }
public interface IFoo<T> : IFoo { }
public class FooHandler<U> where U : IFoo { }

Очень элегантный способ, но при котором не удастся использовать обобщение T в аргументах FooHandler.


public interface IFoo { }
public interface IFoo<T> : IFoo { }
public class FooHandler<U, T> where U : IFoo<T> { }

Очевидный вариант, если T типа IFoo нужно использовать в аргументах FooHandler.


Варианта, где T может автоматически взяться из U, к сожалению не существует, язык такого пока что не позволяет.

  • U нужно мануально указывать повторно
  • не только в FooHandler но и в всех его обобщенных наследниках, нужно писать where U : IFoo<T>, что бы U который ты указываешь мануально не мог отличаться от того, который реализует IFoo
  • 😢 😩 😭