Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在switch语句中使用属性?_C#_.net_Refactoring_Switch Statement - Fatal编程技术网

C# 在switch语句中使用属性?

C# 在switch语句中使用属性?,c#,.net,refactoring,switch-statement,C#,.net,Refactoring,Switch Statement,我在一个类中有一个switch语句,它根据代码文件中的某一行是否与该命令对象的特定代码匹配来生成命令对象 像这样: switch (line): { case "#CODE1": return new Command1(); case "#CODE2": return new Command2(); } switch (line): { case Command1.Code: return new Command1(); case C

我在一个类中有一个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();
}
我想把它变成这样:

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的公共静态属性,但编译器抱怨


有没有一种方法可以做到这一点,而编译器不会对此抱怨?

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

开关仅适用于数值类型和字符串类型,而不适用于属性。您可以尝试在Command1和Command2类上定义一个公共字符串常量,您应该能够打开它

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

由于您使用的是字符串,我不确定这是否是最好的方法,但使用enum对我来说很有用

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

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

我认为你的问题是你需要先实例化你的对象,然后才能确定它们的属性值

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

#CODE1
#CODE2
您希望一个类读取文件的每一行,然后执行标记定义的任何指令

您已经让它工作了,但不是直接对文件中的令牌进行字符串比较,而是希望将令牌的值存储在对象的属性中?这种方法的问题是,在引用对象的属性值之前,必须创建对象的新实例(命令1和命令2)

如果我理解你做了什么,你想做什么,我认为你的解决方案是好的。但我不能100%确定我真的理解你想做什么,或者为什么


HTH

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


如果你有一个jones来使用switch语句,除非你用常量值检查整型,否则你就是SOL。if,else-if,else-if块很难看,但它会满足您的要求。

您可以始终使用经过验证的if/else块

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

这没那么糟糕吧?

我不喜欢需要“记忆”的字符串常量。我希望它们附加到各自的命令。这样就不可能有打字错误。Intellisense会捕捉到它们。没错,但您的代码文件中仍然可能有打字错误。关键是要做你想做的事,你必须先实例化变量。检查属性值后无法创建新实例,必须先创建实例,然后才能检查值。阅读下面的注释后,我不确定编译器为什么会抱怨switch语句,而不是if/then/else。我以为它在抱怨你的对象引用,虽然这还不清楚。如果你让它使用If/then/else结构,并将其改回switch,你是否仍然从编译器中得到错误??不,不是那么邪恶。。。。。。我必须这样做:)我使用了一个名为“Code”的静态只读变量