我正在编写一个简单的解析器,用于使用会话描述协议(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"
...
}
答案 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属性中提取的枚举,回退到成员,在其静态构造函数中创建此字典名称。这意味着每个枚举类型只发生一次反射。