Обработчик интерфейса любого T типа
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 шт):
Автор решения: Yaroslav
→ Ссылка
Ответ на англоязычном 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 - ? ? ?