Если вы подумываете прибегнуть к отражению, всегда старайтесь найти больше вариантов.
Решение - это массивы/списки. Они предназначены для индексированного доступа, требования, которые вы пытаетесь выполнить. Но для этого вам необходимо перестроить существующие указатели ресурсов для инициализации и организации в таком массиве/списке.
1) Для ваших настроек используйте один System.Collection.Specialized.StringCollection, а не несколько отдельных параметров строки. Сделайте первые пустые.
2) Затем настройте элементы управления в массив.
List<Control> controlsArray = new List<Control>();
void FormLoad(...)
{
for (var i = 0; i < 11; i++)
controlsArray.Add(null); //Dummy values
controlsArray.Add(this.Controls.NW11);
controlsArray.Add(this.Controls.NW12);
controlsArray.Add(this.Controls.NW13);
controlsArray.Add(this.Controls.NW14);
controlsArray.Add(this.Controls.NW15);
controlsArray.Add(this.Controls.NW16);
}
3) Затем вы можете сделать это:
private void RefreshTimer_Tick(object sender, EventArgs e)
{
for (int Count = 11; Count <= 16; Count++)
{
if (controlsArray[Count] == null)
continue; //To be on the safe side
Properties.Settings.Default._NW[Count] = controlsArray[Count].Value;
}
Properties.Settings.Default.Save(); //Do this after the assignment loop has finished
}
4) Если у вас есть гораздо больше контроля, и необходимо повторить этот шаблон часто в вашем коде, то вы можете автоматизировать шаг [2] лучше.
List<Control> controlsArray = new List<Control>();
void FormLoad(...)
{
foreach (var control in this.Controls)
{
if (control.Name.StartsWith("NW") == false)
continue;
var numberString = control.Name.SubString(2, control.Name.Length - 2);
var controlNumber = int.Parse(numberString);
while (numberString > controlsArray.Count - 1)
controlsArray.Add(null);
controlsArray[controlNumber] = control;
}
}
Но для такой небольшой проблемы имеет смысл просто использовать свое длинное решение. Почему весь этот код (возможно, удваивает строки, а не так просто, чтобы следить за тем, что он делает - и почему), когда вы можете просто быть явным?
Это зависит от вас, чтобы решить.
Антибликовое Рант
И да, вы всегда должны стараться, чтобы избежать отражения.
Даже для сериализации/десериализации, ответ не является отражением.Вы можете создавать вспомогательные функции во время компиляции или даже генерировать прокси сериализации во время выполнения. Больше работы, конечно, но, конечно, лучше. Инструменты protobuf от Google генерируют файлы кода из файлов протокола во время разработки.
Даже для связи с существующими библиотеками. Например, вы можете использовать Mono.Cecil, чтобы преобразовать все частные интерфейсы в общедоступные во время выполнения, а затем напрямую ссылаться.
Надеюсь, вы поняли суть. У вас не всегда есть ресурсы, но это всегда решение best, когда вы можете избежать отражения.
«это не работает» не является адекватным описанием проблемы. Пожалуйста, укажите, в чем проблема. – Dai
'По умолчанию. (" _ NW "+ Count)' - Что это за синтаксис? – David
Properties.Settings.Default._NW + Значение счетчика -> это синтаксис, указывающий на переменную, где нужно поместить значение NumericUpDown. NumericUpDown - NW + значение счета. На самом деле я заметил, что в коде есть некоторые ошибки из-за копирования и вставки без перечитывания (извините). – tutorialinformation