У меня есть базовый абстрактный класс с несколькими классами, которые расширяют и переопределяют его, однако все они имеют один и тот же конструктор.Прямо сейчас я вызываю каждый конструктор из оператора switch:
case 1: return new A(arg1); // arg is int
и т. Д. Примерно для 10 классов.Есть ли способ с обобщениями или делегатами создать один метод, который бы взял имя класса и создавал экземпляр этого типа с аргументами?
Это помогло бы, поскольку, если я внесу изменение в конструкторы, мне также придется изменить каждыйinstantiation.
Делегат был бы наиболее простым, но исследования говорят «нет» назначению конструкторов делегатам.
ДОПОЛНЕНИЕ: я сейчас на Wi-Fi со своим ноутбуком, а не только с моей камерой, поэтому здесьприходит некоторый код.
Это пример того, что происходит сейчас:
switch (new Random().Next(4))
{
case 3:
// classA : baseClass, args{int, bool, otherClass}
return new classA(arg1, arg2, arg3);
case 2:
// classB : baseClass, args{int, bool, otherClass}
return new classB(arg1, arg2, arg3);
case 1:
// classC : baseClass, args{int, bool, otherClass}
return new classC(arg1, arg2, arg3);
case 0:
// classD : baseClass, args{int, bool, otherClass}
return new classD(arg1, arg2, arg3);
default:
continue;
}
Я хотел бы вызвать один экземпляр в конце блока с тремя аргументами.
Решение, о котором я подумал, состоит в создании класса-экземпляра, который работает примерно так:
ClassInstantiator inst = new ClassInstantiator(arg1, arg2, arg3);
switch(new Random().Next(4))
{
case 4:
return inst.instantiate<classA>();
...
}
Это уже встроено в язык, или кто-нибудь знает о более элегантном решении?