我在一个类中有一个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的公共静态属性来尝试它,但编译器抱怨......
有没有办法按照这个意图做一些事情,编译器不会抱怨?
答案 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();
那不是那么邪恶,是吗?