C# - 是Switch语句中的语句

时间:2013-01-04 12:13:58

标签: c# switch-statement

我需要检查大量控件是否包含值,或者是否将它们留空。

我希望能做到这样的事情:

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 if stuff?谷歌和StackOverflow搜索没有发现任何用途。

5 个答案:

答案 0 :(得分:2)

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 (myInt)
{
case (2+Enumerable.Range(0,2).First()):
    return true;
    default:
    return true;
}

答案 1 :(得分:2)

基于类型的条件(if / switch)主要是一个坏主意。

这种方法怎么样:

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...
}

答案 2 :(得分:1)

你可以这样做:

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

答案 3 :(得分:0)

据我所知,你可以这样做

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;
    }
}

答案 4 :(得分:0)

我也可以去if语句,例如:

    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;
    }