我试图使用字符串的char索引创建一个switch
语句,并使用this包装器创建一个Enum来从Description中获取所选枚举的值。它几乎可以让您将字符串存储为枚举值。
这是我的if
声明:
if (msgComingFromFoo[1] == Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()))
{
//foo
}
这是我的switch
声明:
switch (msgComingFromFoo[1])
{
case Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()):
break;
}
为什么它接受if
语句而不接受switch
?我试图从字符串中选择一个索引,所以尝试将其转换为char,但是不幸的是它没有用。
更新:
这里是Message.Code
枚举
public class Message
{
public enum Code
{
[Description("A")]
FOO_TRIGGER_SIGNAL
}
}
如您所见,我需要分配给枚举的Description而不是为0的枚举值。使用上述包装器中的Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()
返回A
而不是0
错误:
期望一个恒定值
答案 0 :(得分:53)
在C#7之前的情况下,不能有表达式,但是可以在开关中使用,因此可以使用:
switch (ConvertToMessageCode(msgComingFromFoo[1]))
{
case Message.Code.FOO_TRIGGER_SIGNAL:
break;
}
您将需要在其中编写ConvertToMessageCode
到Message.Code
枚举的转换。 ConvertToMessageCode
只是抽象了转换细节,您可能会发现您不需要单独的方法,但是可以使用switch语句中的内联代码,例如强制转换。
答案 1 :(得分:27)
case
语句中的switch
必须引用一个常量值。您无法在case
中计算表达式。
答案 2 :(得分:6)
这确实不是一个好答案,因为它只是对先前答案的详细说明。不接受(也请不要在任何合理的答案上投票)。我之所以将其写为答案,是因为评论不适合这种解释。
您尝试过:
switch (msgComingFromFoo[1])
{
case Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()):
break;
}
这不起作用,因为大小写不恒定。如建议的那样,最好的方法是将msgComingFromFoo[1]
字符串转换回枚举值,以便您可以切换枚举并在切换情况下使用枚举常量。
如果不可能,则可以随时切换字符串常量。但是,这很容易出错,并且一开始就无法使用枚举。
switch (msgComingFromFoo[1])
{
case "A":
break;
}
另一句话:记住数组是零索引的。您当前正在切换第二元素,而不是第一个。将msgComingFromFoo[0]
用作第一个元素。
答案 3 :(得分:5)
要添加到@ code-apprentice的答案中。
如果您发现if
语句变得太长或在if else
内有多个条件。您可以查看代码重构并将逻辑封装到一个对象中,并使用访问者模式来控制要完成的工作。
类似的东西:
public interface IMessageLogic
{
void ProcessMessage()
}
public class TriggerSignal : IMessageLogic
{
public void ProcessMessage()
{
// Do trigger stuff
}
}
public class FooMessage : IMessageLogic
{
public void ProcessMessage()
{
// Do foo stuff
}
}
public class MessageHandler
{
public void HandleMessage(IMessageLogic messageLogic)
{
messageLogic.ProcessMessage();
}
}
public static void Main()
{
IMessageLogic messageLogic = GetMessage();
var handler = new MessageHandler();
handler.HandleMessage(messageLogic);
}