2013-05-21 108 views
1

我想为项目创建一个前缀文本值。我正在使用开关盒。当用户选择相关的单选按钮时,我们应该给出前缀值。布尔开关案例

我应该怎么了“开关()”

来自用户的选择来的值是一个布尔值后放弃。 输出是字符串。

任何帮助..

public string officePostfix() 
    { 
    string postfix = null; 
    switch (...) 
     { 
      case SheetMgrForm.Goldcoast = true: 
       postfix = "QLD"; 
       break; 
      case SheetMgrForm.Melbourne = true: 
       postfix = "MEL"; 
       break; 
      case SheetMgrForm.Sydney = true: 
       postfix = "SYD"; 
       break; 
      case SheetMgrForm.Brisbane = true: 
       postfix = "BIS"; 
       break; 
     } 
     return postfix; 
    } 
+10

我认为你的设计是不正确的。您应该使用“区域”枚举或某些东西(东西是数据库中的ID或标识条目的短代码),而不是每个区域的布尔字段。 –

+0

进一步这种事情看起来应该使用字典来完成...... – Aron

+0

为什么不简单地使用if和else语句? –

回答

5

这不是如何switch作品。您不能在每个case中放置任意布尔表达式(假设您的意思是==而不是=,顺便说一下)。

您需要使用的if-else块一组,如:

if (SheetMgrForm.Goldcoast) { 
    postfix = "QLD"; 
} else if (SheetMgrForm.Melbourne) { 
    postfix = "MEL"; 
} else if ...... 

但是,它看起来像你的设计可以使用一些返工。让所有这些独立的布尔变得笨拙。

+1

虽然这会起作用,但我无法表达我对看到有多少程序员坚持使用if-else-if-else-if-else -...构造,其中一个完美的可枚举类型已经完成或映射会更合适。 – cyborg

3

另一种方法是使用枚举来定义您的区域,然后将它们映射到资源文件。这使得它更易于维护,例如本地化或未来的进一步扩展,并且如果列表很长可能很有用,例如通过T4自动创建枚举和资源,或者您必须查询Web服务,或者其他任何...

例如,假设你有一个AreaPostfixes资源文件和一个Area枚举。

public enum Area 
{ 
    Goldcoast, 
    Melbourne, 
    // ... 
} 

public static class AreaExtensions 
{ 
    public static string Postfix(this Area area) 
    { 
     return AreaPostfixes.ResourceManager.GetString(area.ToString()); 
    } 
} 

// AreaPostfixes.resx 
Name  Value 
Goldcoast QLD 
Melbourne MEL 

// Usage 
public string GetPostfix(Area area) 
{ 
    return area.Postfix(); 
} 

,消除任何需要开关等,您需要确保的唯一事情是,有一个1:每个枚举和资源1映射。我通过单元测试来做到这一点,但如果GetString在Postfix扩展方法中返回null,那么放置Assert或抛出异常就很容易。