Как динамически изменять тип элемента управления?

C # .net, приложение winforms., Visual Studio 2010

Я создал элемент управления c, который может быть текстовым полем или полем со списком. теперь я хочу ввести cast c динамически, что если отправитель является combobox, чем typecast c с combobox, если отправитель является текстовым полем, сделайте c как текстовое поле.

Вот пример кода для этого, но я ищу способ получше.

Если у вас есть, пожалуйста, предложите ..

Теперь я делаю так

private void Test(Object sender, EventArgs e)
{
  Control c = sender as Textbox(); //assuming sender is textbox
  if( c== null)
 {
   c = sender as ComboBox(); // assuming sender is combobox
 }
}

 // I want better way.

Например

c = sender as Combobox() || sender as Textbox //Like this

person yogeshkmrsoni    schedule 20.03.2014    source источник
comment
Вы объявили c как Control, поэтому нет смысла делать что-либо из этого.   -  person Blorgbeard    schedule 20.03.2014


Ответы (2)


Ваш код назначает приведение объекту Control, поэтому на самом деле приведение вам вообще не нужно. Вы могли просто написать:

Control c = sender as Control;

Это работает, потому что ComboBox и TextBox являются производными от Control, и вы всегда можете преобразовать их вверх («вверх» относится к направлению наследования).

Это отлично работает, если все, что вас волнует, - это свойства TextBox и ComboBox, унаследованные от Control. Если вам нужны свойства, специфичные для этих типов, вам нужно выполнить приведение и назначить соответствующий тип:

TextBox b = sender as TextBox;
if (b != null)
{
   //Do stuff with it as a TextBox
}
else
{
    ComboBox c = sender as ComboBox;

    //You should still perform the check here as a matter of good practice.
    if (c != null)
    {
        //Do stuff with it as a ComboBox
    }
}
person BradleyDotNET    schedule 20.03.2014

Вы можете использовать тип динамический:

private void Test(Object sender, EventArgs e)
{
  dynamic box = sender;
  box.DoStuff(); //will throw a run-time exception if DoStuff() doesn't exist 
} 
person Reda    schedule 20.03.2014
comment
OP почти наверняка выбрасывает эти исключения, потому что он явно вызывает событие как из ComboBox, так и из TextBox. Единственный безопасный способ сделать это - получить доступ только к методам / свойствам Control, после чего почему бы просто не привести к Control? Это может быть очень опасный подход. - person BradleyDotNET; 20.03.2014
comment
Я предположил, что он хочет вызвать общие методы, которых нет в родительском классе - person Reda; 21.03.2014