我现在完全坚持了大约 2 天,似乎我根本无法解决我面临的问题。
目前,我正在编写一个 SDP 解析库,它也应该可用于SDP
根据其规范(https://www.rfc-editor.org/rfc/rfc4566)创建正确的消息。但是规范有时非常开放或不清楚,所以我尝试实现必要的灵活性,同时仍然尽可能接近 RFC。
示例问题
SDP 消息可以包含媒体信息(“ m
”字段),因为该信息具有以下模式:
m=<media> <port> <proto> <fmt> ...
示例消息可能如下所示:
m=video 49170/2 RTP/AVP 31
看一下 proto 标志,它代表Media Transport Protocol。根据规范,该字段可以具有以下值:
- RTP/AVP
- RTP/SAVP
- UDP
这是一个值的列表,因此进行枚举显然是合适的。
public enum MediaTransportProtocolType {
RTP/AVP
RTP/SAVP
UDP
}
哎呀!但这不起作用,因为“/”字符。那么,我怎样才能使用它进行解析呢?我Enumeration
用DescriptionAttribute
public enum MediaTransportProtocolType {
[Description("RTP/AVP")
RTP_AVP
[Description("RTP/SAVP")
RTP_SAVP
[Description("UDP")
UDP
}
现在我可以通过它的描述简单地查找适当的媒体传输协议类型。但现在,RFC 规范继续:
This memo registers three values [...] If other RTP profiles are
defined in the future [...]
因此,未来的网络设备可能会向我发送我不知道的媒体传输协议。整个枚举的东西在这里不再起作用,因为System.Enum
由于各种原因无法扩展。
解决方案
在寻找解决方案的路上,我遇到了类型安全枚举模式(AKA StringEnum
),如下所述:我如何在类型安全枚举模式上使用 switch 语句。这个答案甚至描述了一种使它们可切换的解决方案,即使它是一个丑陋的解决方案恕我直言。
但同样,这仅适用于定义的范围。我用字典扩展了这个Type Safe Enumeration
类来存储我可以在解析时查找的实例,但如果我现在不添加新的实例,我也会添加它们。
但是所有其他领域呢?那么铸造呢?
这里的答案描述了一种使用基类并通过显式运算符进行强制转换的方法:Casting string to type-safe-enum using user-defined conversion
我试过了,但它并没有按照我想要的方式工作。(无效的转换异常,脏的两次转换模式,不可扩展)。
如何在提供允许创建正确 SDP 的库的同时正确轻松地解析 SDP 信息?