使用枚举c#分配属性的最佳方法

时间:2012-05-22 10:18:23

标签: c# enums

如何有效扩展枚举以获得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”之类的值的字符串。

当只有AD时,此功能正常,但我希望再增加2种类型;说RC。当我将它们添加到枚举字段时,我该如何获得该类型?上面给出了编译错误,就像使用Type作为变量一样。

感谢您的直接帮助! 感谢

4 个答案:

答案 0 :(得分:4)

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

Enum.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

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

使用属性

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

答案 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;