С# - это выражение в инструкции switch

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

Я надеялся сделать что-то вроде этого:

public static bool IsObjectEmpty(Control ctrlThis)
 {
 switch (ctrlThis)
 {
 case ctrlThis is TextBox:
 TextBox txtThis = (TextBox)ctrlThis;
 if (txtThis.Text == "" || txtThis.Text == null)
 { return false; }
 break;
 case (ctrlThis is ComboBox):
 ComboBox cboThis = (ComboBox)ctrlThis;
 if (cboThis.SelectedValue == -1)
 { return false; }
 break;
 case (ctrlThis is NumericUpDown):
 NumericUpDown numThis = (NumericUpDown)ctrlThis;
 if (numThis.Value == 0)
 { return false; }
 break;
 etc etc...

Но это не скомпилируется:

Error 3 A switch expression or case label must be a bool, char, string, 
 integral, enum, or corresponding nullable type

Есть ли способ сделать это в инструкции switch, или мне просто нужно сделать нагрузку if/else, если это так? Поиски Google и StackOverflow практически не использовались.

5 ответов

Case метки могут содержать только константное выражение.

поэтому в вашем ответе нет выражения const.

это оценочное значение.

столько же, сколько вы не можете сделать

public const int a=Enumerable.Range(0,2).First();

вы можете вывести эти значения перед корпусом коммутатора

а затем сравните их со значением.

что-то вроде

var t=(ctrlThis is ComboBox)

...
...
switch ( t) ...
case true :...

изменить: из CLS

switch-label:
 case constant-expression :
 default :

Если вы не сделаете так, как компилятор будет кричать:

Ожидается постоянное значение

пример:

switch (*****)
{
case (2+Enumerable.Range(0,2).First()):
 return true;
 default:
 return true;
}


Условия (если/переключатель), основанные на типе, являются в основном плохими идеями.

Как насчет этого подхода:

public static bool IsObjectEmpty(TextBox ctrlThis)
{
 if (ctrlThis.Text == "" || ctrlThis.Text == null) {
 return false;
 }
 etc etc...
} 
public static bool IsObjectEmpty(ComboBox ctrlThis)
{
 if (ctrlThis.SelectedValue == -1) {
 return false;
 }
 etc etc...
} 
public static bool IsObjectEmpty(NumericUpDown ctrlThis)
{
 if (ctrlThis.Value == 0) {
 return false;
 }
 etc etc...
}


Вы можете сделать:

switch (ctrlThis.GetType().ToString())
{
 case "System.Windows.Forms.TextBox" :
 TextBox txtThis = (TextBox)ctrlThis;
 if (txtThis.Text == "" || txtThis.Text == null)
 { return false; }
 break;
}


Насколько я знаю, вы можете сделать это так:

public static bool IsObjectEmpty(Control ctrlThis)
{
 Type t = ctrlThis.GetType();
 switch (t)
 {
 case typeof(TextBox):
 TextBox txtThis = (TextBox)ctrlThis;
 if (txtThis.Text == "" || txtThis.Text == null)
 { return false; }
 break;
 }
}


Я мог бы также использовать if-statements, например:

public static bool IsObjectEmpty(Control ctrlThis)
 {
 if (ctrlThis is TextBox)
 {
 TextBox txtThis = (TextBox)ctrlThis;
 if (txtThis.Text == "" || txtThis.Text == null)
 return false;
 }
 else if (ctrlThis is ComboBox)
 {
 ComboBox cboThis = (ComboBox)ctrlThis;
 if (int.Parse(cboThis.SelectedValue.ToString()) == -1)
 return false;
 }
 else if (ctrlThis is NumericUpDown)
 {
 NumericUpDown numThis = (NumericUpDown)ctrlThis;
 if (numThis.Value == 0)
 return false;
 }
 else
 {
 //Serves as 'default' in the switch
 }
 return true;
 }

licensed under cc by-sa 3.0 with attribution.