У меня есть базовый класс с несколькими производными классами:Как преобразовать класс <Derived> в класс <Base>?
class Base { }
class Derived1 : Base { }
class Derived2 : Base { }
Тогда у меня есть класс, работник, который принимает этот класс в качестве универсального типа:
class WorkerClass<T> where T : Base, new()
{
WorkerClass() { }
void DoStuff()
{
T container = new T();
// do stuff
}
}
Проблема в том, когда я создаю экземпляр WorkerClass, я имеет тип только как переменную. Я хотел бы сделать это:
void DoStuff(Type type)
{
WorkerClass<Base> worker_class = null;
if(type == typeof(Derived1))
{
worker_class = new WorkerClass<Derived1>(); // compiler error
}
else if(type == typeof(Derived2))
{
worker_class = new WorkerClass<Derived2>(); // compiler error
}
// lots of common code with worker_class
worker_class.DoStuff();
}
Но компилятор жалуется неявно литье WorkerClass<Derived>
в WorkerClass<Base>
. Явное кастинг также дает ошибку. Компилятор предлагает определить public static implicit operator WorkerClass<T>(WorkerClass<Derived>)
, но я не уверен, как будет выглядеть этот код. Я мог бы, очевидно, поставить всю логику внутри if-else, но это кажется ненужным повторением.
вместо 'DoStuff (типа Type)' использовать универсальный метод. 'DoStuff() где T2: Base, new()' –