Я хочу получить назначенные конструктором значения элементов управления, например, когда я спроектировал TextBox
с .Text
«Hello World», а затем изменить .Text
во время выполнения: как я могу получить строку «Hello»Мир снова во время выполнения?
Мои мысли пока таковы: я могу написать процедуру настройки и назначить эти значения «по умолчанию» там в одиночку, и снова вызывать этот метод, когда захочу сбросить значения. Минусы:
- Не такой гибкий (нет способа сброса отдельных элементов управления)
- потребуется написать подпрограмму для каждой реализации
- упущено из-за удобства простой установки значений один раз в конструкторе
Мне бы очень хотелось статический метод / расширение, которое позволило бы мне подключить мой элемент управления и получить значения, назначенные ему в конструкторе моего класса.
Я начал пытаться реализовать расширение в своем расширениибиблиотека, в которой я создаю новый экземпляр основного класса Form и извлекаю значение оттуда - но у этого подхода есть очевидные недостатки:
- Form Class может иметь разные сигнатуры конструктора, например string[] args
для приложений с консольными аргументами;создание экземпляров неизвестных подписей не является тривиальной или хорошей идеей в целом
- Это тяжелый подход;в зависимости от сложности проекта, вам может не потребоваться создавать стопки экземпляров каждый раз, когда вы хотите получить назначенное конструктором значение элемента управления.
- это выполнит любой код в конструкторе
Поэтому я очень надеюсь, что смогу использовать Reflection
или что-то подобное, чтобы получить значения, назначенные дизайнером.
Но я не знаю, как искать это;поиск в Google таких вещей, как «Visual .Net Get Designer Control по умолчанию», не дал соответствующих результатов.
Может кто-нибудь указать мне правильное направление?
Мой метод расширения теста в настоящее время выглядит примерно так:
public static string getDefaultText(this Control c)
{
Form mainForm = Form.ActiveForm; // just a quick easy way to test this
Type t = mainForm.GetType();
var f = Activator.CreateInstance(t);
Control a = ((Form)f).Controls[c.Name]; // unfortunately, .Controls only contains direct children, not all descendants; recursive searching would be needed
return a.Text;
}
и работает таким, какой он есть, то есть доказательством концепции плохого подхода: /