Отправитель броска возражает в использовании обработчика событий GetType ().Name

#define IsIOS8 (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)
22
задан tfl 11 March 2009 в 11:18
поделиться

7 ответов

В зависимости от того, в каких свойствах Вы нуждаетесь, Вы могли снять отправителя в качестве TextBoxBase и как TextBox и как RichTextBox, который оба наследовали от того подкласса.

3
ответ дан Kieron 28 November 2019 в 23:13
поделиться

Вы никогда не должны бросать. Я раньше думал тот же путь, когда я запустил, этот 'шаблон' является неправильным, и не действительно логичным.

Ваш лучший выбор состоит в том, чтобы использовать что-то как:

if (sender is TextBox)
{
  TextBox tb = (TextBox)sender;
}
else if (sender is RichTextBox)
{
  RichTextBox rtb = (RichTextBox)sender;
}
else
{
  // etc
}
30
ответ дан leppie 28 November 2019 в 23:13
поделиться
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";
}
4
ответ дан Chris S 28 November 2019 в 23:13
поделиться

Кастинг может только быть сделан во время компиляции, и таким образом необходимо знать типы, к которым Вы хотите бросить во время компиляции. Тип выполнения (как возвращено GetType ()) не может поэтому использоваться при кастинге.

, Если это - полиморфизм, Вы ищете Вас, мог бы получить доступ к свойству Name посредством отражения. Я не пошел бы тем путем, хотя только быть в состоянии снова использовать обработчики событий.

, Если Вы хотите строгий контроль типов, общий базовый класс или интерфейс на этих двух отправителях, единственный способ пойти.

3
ответ дан Peter Lillevold 28 November 2019 в 23:13
поделиться

Вместо имени типа Вы могли использовать' , '.

, Если Вы просто хотите знать тип и не нуждаться в ссылке на объект:

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";
}
2
ответ дан stuartd 28 November 2019 в 23:13
поделиться

Если код идентичен, необходимо ли заботиться? Интересно, если кастинг к Control не дал бы Вам все, в чем Вы нуждаетесь...

Один сложный обработчик не обязательно лучше, чем несколько простых обработчиков. Так или иначе, если Вы имеете , чтобы пойти этим путем, "как"/, предпочтительно (это не зависит от строк и т.д.):

TextBox tb = sender as TextBox;
if(tb!=null) {/* TextBox specific code */}
...
0
ответ дан Marc Gravell 28 November 2019 в 23:13
поделиться

если Вы не хотите повторять код тогда, можно бросить обоих средства управления, осуществить рефакторинг общие действия к отдельному методу, который берет TextBoxBase в качестве аргумента. И в Ваших обработчиках событий преобразовывают средства управления в Систему. Windows. Формы. TextBoxBase как оба средств управления получены из TexbBoxBase и называют метод.

отметьте, нужны ли Вам определенные свойства каких-либо из этих средств управления тогда эта работа привычки рефакторинга.

0
ответ дан gk. 28 November 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: