0

我怎样才能有效地扩展枚举以拥有超过 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”这样的值的字符串在哪里。

当只有Aand时,这很好用D,但我想再有 2 种类型;说RC。当我将它们添加到枚举字段时,如何获取类型?以上给出了编译错误,就好像使用 Type 作为变量一样。

感谢您的即时帮助!谢谢

4

4 回答 4

5

实际上只有三种明智的方法可以解决这个问题:

枚举.TryParse

如果令牌将始终与您的枚举成员完全对应,您可以使用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

这需要一些设置,但它可能是最快的,它还允许考虑输入字符串和/或枚举值的变化。

使用属性

或者,您可以使用自定义属性注释您的枚举成员,并编写一个辅助方法,该方法使用反射来根据此属性的值查找正确的成员。该解决方案有其用途,但可能性最小;大多数时候,您应该更喜欢这两种选择之一。

于 2012-05-22T10:21:33.200 回答
0

你可以Enum.Parse用来解析一个字符串。对于错误处理,您可以使用Enum.GetNames(typeof(EventType))并迭代返回的字符串数组,其中包含枚举的所有可能名称。

var type = (EventType)Enum.Parse(typeof(EventType), tokens[2]);
于 2012-05-22T10:22:48.100 回答
0

您可以想使用Enum.Parse来获取匹配值:

Type = Enum.Parse(typeof(EventType), tokens[2])

如果tokens[2]未在 中定义EventType,则Enum.Parse抛出异常,因此您可以使用Enum.IsDefined检查字符串是否存在枚举值:

Enum.IsDefined(typeof(EventType), tokens[2]) 
于 2012-05-22T10:24:28.670 回答
-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;
于 2012-05-22T10:22:53.090 回答