#define IsIOS8 (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)
В зависимости от того, в каких свойствах Вы нуждаетесь, Вы могли снять отправителя в качестве TextBoxBase и как TextBox и как RichTextBox, который оба наследовали от того подкласса.
Вы никогда не должны бросать. Я раньше думал тот же путь, когда я запустил, этот 'шаблон' является неправильным, и не действительно логичным.
Ваш лучший выбор состоит в том, чтобы использовать что-то как:
if (sender is TextBox)
{
TextBox tb = (TextBox)sender;
}
else if (sender is RichTextBox)
{
RichTextBox rtb = (RichTextBox)sender;
}
else
{
// etc
}
RichTextBox textbox = sender as RichTextBox;
if (textbox != null)
{
// do stuff as a rtb
textbox.Text = "I'm a rtb";
return;
}
TextBox textbox = sender as TextBox;
if (textbox != null)
{
// do stuff as a textbox
textbox.Text = "I'm a textbox";
}
Кастинг может только быть сделан во время компиляции, и таким образом необходимо знать типы, к которым Вы хотите бросить во время компиляции. Тип выполнения (как возвращено GetType ()) не может поэтому использоваться при кастинге.
, Если это - полиморфизм, Вы ищете Вас, мог бы получить доступ к свойству Name посредством отражения. Я не пошел бы тем путем, хотя только быть в состоянии снова использовать обработчики событий.
, Если Вы хотите строгий контроль типов, общий базовый класс или интерфейс на этих двух отправителях, единственный способ пойти.
Вместо имени типа Вы могли использовать' , '.
, Если Вы просто хотите знать тип и не нуждаться в ссылке на объект:
if (sender is RichTextBox)
{
// ...
}
else if (sender is TextBox)
{
// ...
}
Однако Вы обычно хотите объект: C#7 имеет хороший синтаксис, который позволяет Вам тестировать и получать встроенное значение:
if (sender is RichTextBox richTextBox)
{
richTextBox.Text = "I am rich";
}
else if (sender is TextBox textBox)
{
textBox.Text = "I am not rich";
}
Если код идентичен, необходимо ли заботиться? Интересно, если кастинг к Control
не дал бы Вам все, в чем Вы нуждаетесь...
Один сложный обработчик не обязательно лучше, чем несколько простых обработчиков. Так или иначе, если Вы имеете , чтобы пойти этим путем, "как"/, предпочтительно (это не зависит от строк и т.д.):
TextBox tb = sender as TextBox;
if(tb!=null) {/* TextBox specific code */}
...
если Вы не хотите повторять код тогда, можно бросить обоих средства управления, осуществить рефакторинг общие действия к отдельному методу, который берет TextBoxBase в качестве аргумента. И в Ваших обработчиках событий преобразовывают средства управления в Систему. Windows. Формы. TextBoxBase как оба средств управления получены из TexbBoxBase и называют метод.
отметьте, нужны ли Вам определенные свойства каких-либо из этих средств управления тогда эта работа привычки рефакторинга.