2009-08-04 99 views
2

我在一个生成Command对象的类中有一个switch语句,它基于代码文件中的某一行是否与该Command对象的特定代码相匹配。在switch语句中使用属性?

这样的:

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

我想它创建的Command一个公共静态属性,但是编译器会抱怨...

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

回答

9

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

2

切换仅适用于数字类型和字符串类型,不适用于属性。你可以尝试在你的Command1和Command2类上定义一个公共字符串常量,你应该可以改用它。

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

,因为你正在处理字符串我不知道这是否是最好的方法,但使用枚举对我的作品

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

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

我觉得你的问题是你需要在你面前来实例对象可以确定其属性值。

我假设你有一个标记化指令代码文件,如:

#CODE1 
#CODE2 

,你想一个类来读取文件的每一行,然后执行指令为准令牌定义。

你得到它的工作,而不是做一个直接的字符串比较文件中的令牌,你想要的对象的属性中存储的令牌的价值?该方法的问题在于,您必须先创建对象的新实例(命令1和2),然后才能引用其属性值。

如果我明白你已经做了什么以及你想做什么,我认为你的解决方案很好。我不是100%确定我真的明白你想要做什么,或者为什么。

HTH

+0

我不喜欢让字符串常量需要“记忆”。我希望他们连接到他们各自的命令。这种方式不可能出现拼写错误。智能感知将抓住他们。 – 2009-08-04 20:31:22

+0

是的,但您的代码文件中仍可能有拼写错误。关键是要做你想做的事情,你必须首先实例化变量。在检查属性值后,您不能创建新实例,您必须先创建实例,然后才能检查值。 – Beth 2009-08-05 16:59:28

0

如果你想检查一个类的属性。我假设你可能希望能够改变这些属性并相应地进行检查。您将不得不使用if,else if,else if类型语句。

如果你有一个琼斯使用switch语句,你是SOL,除非你正在检查一个整数类型与常量值。如果,否则,如果块是丑陋的,但它会做你想要的。

0

你总是可以依傍的尝试和真正的if/else块

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

这不是那么邪恶,是吗?