关于解析的常量vs枚举

时间:2013-07-16 07:54:21

标签: c# .net string enums

我正在编写一个简单的解析器,用于使用会话描述协议(SDP;参见:https://tools.ietf.org/html/rfc4566)提供的流信息。

对于各种字段,例如 originator media ,有些标志可以具有不同的值。例如, media 字段上的媒体传输协议(请参阅:https://tools.ietf.org/html/rfc4566#section-8.2.2

m=audio 49170 RTP/AVP 0

根据规范,proto标志(媒体传输协议)可以是“RTP / AVP”,“RTP / SAVP”或“UDP”。

因为此标志可以有多个值,所以使用enum是合适的:

public enum MediaTransportProtocol {
    UDP,
    RTP_AVP
    RTP_SAVP
}

但现在问题在于:没有字符串枚举这样的东西,所以我不能用这个来解析(例如因为RTP中的“/”字符/ AVP ..)因此,我必须定义其他常量,以便在解析媒体字段时切换媒体传输协议标志。

我考虑在每个DESCRIPTION字段上使用“enum”属性,但之后我必须编写一个额外的方法/扩展方法来接收enum flag description(收集枚举) description属性不是一项琐碎的任务恕我直言。

解析此类数据的最佳做法是什么?或者有类似字符串枚举的东西,我只是不知道它?

public enum MyStringEnum {
    ENUMVAL1 = "EnumVal-01",
    ENUMVAL2 = "EnumVal-02"
    ...
}

3 个答案:

答案 0 :(得分:2)

没有。枚举基本上是整数。

让我给你一些建议:

1)在你的枚举上使用属性

 public enum MyStringEnum {
        [ProtoFlagName("RTP/AVP")]
        ENUMVAL1 = 1,

        [ProtoFlagName("RTP/SAVP")]
        ENUMVAL2 = 2
        ...
 }

2)选择不同的数据结构,例如List<string>Dictionary<MyStringEnum, string>

3)(不要老实说这个)。使用'_'符号代替'/'。然后只需在获得字符串值后对其进行后处理:

var stringValue = Enum.GetName(typeof(MyStringEnum ), MyStringEnum.ENUMVAL1);
var correctedStringValue = stringValue.Replace('_', '/');

答案 1 :(得分:1)

Artur Udod有一个有趣的想法(#1)。另一种方法是用'_'替换'/'字符。然后使用枚举解析函数。

tokenStr = tokenStr.replace('/', '_');
enumVal = Enum.Parse(typeof(MediaTransportProtocol), tokenStr);

我隐含假设您的令牌字符集仅限于字母,可能是数字和斜杠。显然,如果A_B和A / B形式的两个令牌被认为是不同的,那么这将是一个问题。

答案 2 :(得分:1)

实际上Name的{​​{1}}属性可能是最好的方法。你会发现许多使用它的例子,通常用于填充下拉组合。

我保留了实用程序库,其中存储了这样的函数,这意味着我只需要编写一次函数。

如果您不想使用属性,那么最好的办法是为查找创建字典。

DisplayAttribute

然后,您可以执行查找并保留在代码中使用 public static readonly Dictionary<string,MediaTransportProtocol> MediaTransportProtocols = new Dictionary<string,MediaTransportProtocol> { {"UDP", MediaTransportProtocol.UDP}, {"RTP/AVP", MediaTransportProtocol.RTP_AVP}, {"RTP_SAVP", MediaTransportProtocol.RTP_SAVP}, }; 的优势。

理想的解决方案,就是我的库所做的,是创建一个静态泛型类enum,通过反映从Display属性中提取的枚举,回退到成员,在其静态构造函数中创建此字典名称。这意味着每个枚举类型只发生一次反射。