如何使用带有 Guid 的 switch 语句?

17
在以下的C#代码中,cboRole返回一个Guid。
我尝试在switch语句中使用它来执行一些操作。
由于cboRole只能返回4种不同的Guid,所以我认为switch是我的最佳选择。
问题在于所有的case都被忽略了,我总是得到默认的操作。当我调试时,我清楚地看到cboRole返回一个像下面截图中的值。
在C#中,用于"比较"Guids的正确方法是什么?
代码:
if (!cboRole.IsNull)
{
    switch (cboRole.EditValue.ToStringEx())
        {
            case "532E8EED-9E72-42E0-871E-36470C1AE327":
                param1 = "4E08BA7C-E81F-40AE-92F0-DF33A98DD0BB";
                MessageBox.Show("It's working");
                break;
            case "FA7637E9-A9E4-4D57-A59B-80615424D27F":
                param1 = "E540C382-F22C-4FE2-9068-1E10AA8DD076";
                break;
            case "2734CCD9-93E6-4A86-8B83-5EA9E62FA921":
                param1 = "8A54F8D5-5B74-4B3F-A29A-D423AA8DD02E";
                break;
            default:
                MessageBox.Show("Not Working");
                break;
        }

调试打印屏幕截图


1
我不知道你从哪里得到了ToStringEx()函数,但是在guid上使用普通的ToString()会返回小写的guid。只需使用cboRole.EditValue.ToString().ToUpper(),你就可以了。 - igelineau
2
不管 EditValue 是什么,重要的是 ToStringEx() 方法返回了什么。 - Sam I am says Reinstate Monica
你还应该考虑创建具有有意义名称的常量,并将你的GUID存储在其中,而不仅仅是在switch语句中使用它们。const string MyGuidValue1 = "532E8EED-9E72-42E0-871E-36470C1AE327"; - igelineau
2个回答

34

使用C# 7,您现在可以使用模式匹配与switch语句一起使用。

switch (cboRole)
{
    case var r when (r == new Guid("532E8EED-9E72-42E0-871E-36470C1AE327")):
        param1 = "4E08BA7C-E81F-40AE-92F0-DF33A98DD0BB";
        MessageBox.Show("It's working");
        break;
    case var r when (r == new Guid("FA7637E9-A9E4-4D57-A59B-80615424D27F")):
        param1 = "E540C382-F22C-4FE2-9068-1E10AA8DD076";
        break;
    case var r when (r == new Guid("2734CCD9-93E6-4A86-8B83-5EA9E62FA921")):
        param1 = "8A54F8D5-5B74-4B3F-A29A-D423AA8DD02E";
        break;
    default:
        MessageBox.Show("Not Working");
        break;
}

如果您定义了静态只读的新 Guid(..) 变量,此方法也可行。


1
这好多了。还可以与T4模板一起使用!! - Brain2000

12

你的 switch 语句使用的是大写字母,而你的 ToStringEx() 方法返回的是小写字母的 Guid

你可以使用下面这段代码:

switch (cboRole.EditValue.ToStringEx().ToUpper())

或者修改你的case语句。


1
+1,ToString 函数默认实现返回小写的 GUID。 - Habib
1
你知道 ToStringEx 是做什么的吗?你能确定 ToStringEx 不会自动将字符串转换为大写吗?你能确定 ToStringEx 不会做其他事情吗? - Sam I am says Reinstate Monica
3
@SamIam,确实可能会有其他作用,但我认为假设它确实是这种情况(不打趣)还是相当合理的。如果不是这样,我相信原帖作者会发表评论。 - Adi Lester
抱歉,我不知道如何在迷你评论中发布代码,但是这里是ToStringEx()方法的作用:public static string ToStringEx(this object theString) { if (theString == null || theString == DBNull.Value) { return string.Empty; } return theString.ToString(); } - Martin Lebel
@MartinLebel 使用 ` 包裹你的文本,这样就可以创建如下代码 Hello, World! - Zeliax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接