在switch语句中使用属性?

时间:2009-08-04 18:36:00

标签: c# .net refactoring switch-statement

我在一个类中有一个switch语句,它根据代码文件中的某一行是否与该Command对象的特定代码匹配来生成Command对象。

像这样:

switch (line):
{
   case "#CODE1":
      return new Command1();
   case "#CODE2":
      return new Command2();
}

我想把它变成这样的东西:

switch (line):
{
   case Command1.Code:
      return new Command1();
   case Command2.Code:
      return new Command2();
}

我通过创建Command1的公共静态属性来尝试它,但编译器抱怨......

有没有办法按照这个意图做一些事情,编译器不会抱怨?

6 个答案:

答案 0 :(得分:9)

我认为你只能用常量来做这个...所以如果你可以使用常量字段而不是公共静态属性。区别在于它在编译时被视为文字,因此如果值发生更改,则需要重新编译引用该常量的所有程序集。

答案 1 :(得分:2)

Switch仅适用于数字类型和字符串类型,而不适用于属性。您可以尝试在Command1和Command2类上定义一个公共字符串常量,您应该可以在其中启用它。

public class Command1 
{
   public string const Code = "#CODE1";
}

答案 2 :(得分:1)

因为你正在处理字符串我不确定它是否是最好的方法,但使用枚举对我有用

enum CommandEnum { CommandOne, ComandTwo, CommandN }
//...

CommandEnum myCommand;
//...
switch (myCommand)
{
  case myCommand.CommandOne:
       return new Command1();
  case myCommand.CommandTwo:
       return new Command2();
  //...
}

答案 3 :(得分:0)

我认为您的问题是您需要在确定其属性值之前实例化对象。

我假设您有一个带有标记化指令的代码文件,例如:

#CODE1
#CODE2

并且您希望类读取文件的每一行,然后执行令牌定义的任何指令。

您可以使用它,但是您不希望与文件中的令牌进行直接字符串比较,而是希望将令牌的值存储在对象的属性中?该方法的问题是您必须先创建对象的新实例(命令1和2),然后才能引用它们的属性值。

如果我明白你做了什么以及你想做什么,我认为你的解决方案很好。我不是百分百肯定我真的明白你想做什么,或者为什么。

HTH

答案 4 :(得分:0)

如果要检查类的属性。我假设您可能希望能够更改这些属性并进行相应检查。你必须使用if,else if,else if type语句。

如果你有一个使用switch语句的jones,那么你就是SOL,除非你在对常数值检查一个整数类型。如果,否则如果,否则如果块是丑陋的,但它会做你想要的。

答案 5 :(得分:0)

你总是可以依靠尝试过的if / else块

 if (line == Command1.Code)
  return new Command1();
 else if (line == Command2.Code)
  return new Command2();

那不是那么邪恶,是吗?