Назовите меня сумасшедшим, но я тип парня, которому нравятся конструкторы с параметрами (если необходимо), в отличие от конструктора без параметров, за которым следует настройка свойств. Мой мыслительный процесс: если свойства необходимы для фактического построения объекта, они должны войти в конструктор. Я получаю два преимущества:
- Я знаю, что когда объект построен (без ошибки/исключения), мой объект хорош.
- Это помогает избежать забывания установить определенное свойство.
Этот менталитет начинает навредить мне в отношении разработки формы/пользовательского контроля. Представьте себе этот UserControl
:
public partial class MyUserControl : UserControl
{
public MyUserControl(int parm1, string parm2)
{
// We'll do something with the parms, I promise
InitializeComponent();
}
}
В момент разработки, если я отброшу этот UserControl
в форме, я получаю Exception
:
Не удалось создать компонент "MyUserControl"...
System.MissingMethodException - для этого объекта не задан конструктор без параметров.
Кажется, для меня единственным способом было добавить конструктор по умолчанию (если кто-то еще не знает способ).
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
}
public MyUserControl(int parm1, string parm2)
{
// We'll do something with the parms, I promise
InitializeComponent();
}
}
Весь смысл не включать конструктор без параметров заключается в том, чтобы избежать его использования. И я даже не могу использовать свойство DesignMode
, чтобы сделать что-то вроде:
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
if (this.DesignMode)
{
InitializeComponent();
return;
}
throw new Exception("Use constructor with parameters");
}
}
Это также не работает:
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
Хорошо, двигаясь вдоль...
У меня есть свой конструктор без параметров, я могу отбросить его в форме, а форма InitializeComponent
будет выглядеть так:
private void InitializeComponent()
{
this.myControl1 = new MyControl();
// blah, blah
}
И верьте мне, потому что я сделал это (да, игнорируя комментарии Visual Studio сгенерированные), я попытался возиться, и я передал параметры InitializeComponent
, чтобы передать их в конструктор MyControl
.
Что приводит меня к этому:
public MyForm()
{
InitializeComponent(); // Constructed once with no parameters
// Constructed a second time, what I really want
this.myControl1 = new MyControl(anInt, aString);
}
Чтобы использовать UserControl
с параметрами конструктора, мне нужно добавить второй конструктор, который мне не нужен? И создать экземпляр управления дважды?
Я чувствую, что должен делать что-то неправильно. Мысли? Мнения? Обеспечение (надеюсь)?