如何有效扩展枚举以获得2个以上的选项。 我正在逐行读取文件中的事件。 我有一个构造函数
public enum EventType
{ A,D }
public class Event
{
public EventType Type { get; set; }
}
我像这样分配了Type属性:
Type = tokens[2].Equals("A") ? EventType.A : EventType.D,
其中token[2]
是包含“A”之类的值的字符串。
当只有A
和D
时,此功能正常,但我希望再增加2种类型;说R
和C
。当我将它们添加到枚举字段时,我该如何获得该类型?上面给出了编译错误,就像使用Type作为变量一样。
感谢您的直接帮助! 感谢
答案 0 :(得分:4)
实际上只有三种合理的方法可以解决这个问题:
如果令牌始终与完全对应您的枚举成员,则可以使用Enum.TryParse
:
EventType type;
if (Enum.TryParse(tokens[2], out type)) {
Type = type;
}
else { /* token does not exist as an enum member */ }
这种方法最简单,但它可能比下一种方法慢,而且还有另一个缺点:提供tokens[2]
的代码的作者和枚举的作者必须始终保持代码同步。
var dict = new Dictionary<string, EventType>
{
{ "A", EventType.A },
{ "D", EventType.D },
// more items here
}
Type = dict[tokens[2]]; // no error checking, please add some
这需要一些设置,但它可能是最快的,它还允许考虑输入字符串和/或枚举值的变化。
或者,您可以使用自定义属性注释枚举成员,并编写一个帮助方法,该方法使用反射根据此属性的值查找正确的成员。该解决方案有其用途,但它是最不可能的候选者;大多数时候你应该更喜欢两种选择中的一种。
答案 1 :(得分:0)
您可以使用Enum.Parse
来解析字符串。对于错误处理,您可以使用Enum.GetNames(typeof(EventType))
并迭代返回的字符串数组,该数组包含枚举的所有可能名称。
var type = (EventType)Enum.Parse(typeof(EventType), tokens[2]);
答案 2 :(得分:0)
您可以使用Enum.Parse
来获取匹配值:
Type = Enum.Parse(typeof(EventType), tokens[2])
如果tokens[2]
中未定义EventType
,则Enum.Parse
会抛出异常,因此您可以使用Enum.IsDefined
检查字符串是否存在枚举值:< / p>
Enum.IsDefined(typeof(EventType), tokens[2])
答案 3 :(得分:-2)
EventType et;
switch(tokens[2])
{
case "A":
et=EventType.A;
break;
case "B":
et=EventType.B;
break;
case "C":
et=EventType.C;
break;
}
return et;