У меня есть приложение C#, в котором мне нужно переключаться между классами в соответствии со значением целочисленной переменной. У меня есть массив строк «myvar», который должен получать значения из одного из классов (myclass1, myclass2, myclass3....) в соответствии со значением целочисленной переменной (var1). В настоящее время я использую следующий код. Я хочу сократить свой код, используя словарь. Однажды я использовал словарь для перевода строковой переменной в список строк. Но я не могу адаптировать его к своему текущему варианту использования, потому что здесь мне приходится переключаться между классами. Можно ли в моем случае воспользоваться словарем?
myclass1 my_class1 = new myclass1();
myclass2 my_class2 = new myclass2();
myclass3 my_class3 = new myclass3();
//several other classes
int var1 = 0;
string[] myvar= new string[999];
public void my_method()
{
for(int j = 0; j < 999; j++)
{
if (var1==1)
{
myvar[j] = my_class1.varlist[j];
}
if (var1==2)
{
myvar[j] = my_class2.varlist[j];
}
if (var1==3)
{
myvar[j] = my_class3.varlist[j];
}
// same for the rest classes
}
}
создать общий базовый класс/интерфейс, который раскрывает varlist
... поместить материал в массив/список... использовать индекс... также, если myclassX
выглядит так же, как myclassY
, то вам, скорее всего, следует использовать один класс... похоже на XY проблема
Вы можете создать Dictionary<int, IList<int>>
и добавить varlist
из классов.
Кстати, у вас действительно 999 разных классов, потому что вам нужно 999 списков? Это должно быть реорганизовано в первую очередь. Создайте один класс со словарем вместо 999 различных типов.
@TimSchmelter Нет, в списке переменных всего 999 элементов. Количество занятий ограничено 5-10. Каждый класс имеет список переменных контроллера ЧПУ в соответствии с его версией ЧПУ. Итак, для 10 разных версий имеется 10 списков переменных в 10 разных классах.
Вы можете определить общий интерфейс и создать на его основе словарь.
Например.
interface IMyClass {
int GetItem(int index);
}
class MyClass1 : IMyClass {
public int GetItem(int index) {
// actual code here...
}
}
Dictionary<int, IMyClass> myClasses = new {
{ 1, new MyClass1() },
{ 2, new MyClass2() },
{ 3, new MyClass3() },
};
Вероятно, вы могли бы использовать отражение для преобразования собранной строки в класс, а затем создать экземпляр этого класса (или сделать список статическим, если это возможно), см. stackoverflow.com/questions/4876683/… Но: если вы сделав это, вы, вероятно, потеряете некоторые возможности вашей IDE (например, рефакторинг вызовов использования и т. д.), поскольку она больше не знает конкретный тип переменной. Иногда полезно иметь немного раздутый, но более явный код. Я не говорю, что это применимо и здесь, вы знаете это лучше меня.