0

我目前正在编写一个简单的解析器,用于使用会话描述协议(SDP;参见:https ://www.rfc-editor.org/rfc/rfc4566 )传递的流信息。

对于不同的字段,例如originatormedia,存在可以具有不同值的标志。例如,媒体字段上的媒体传输协议(参见:https ://www.rfc-editor.org/rfc/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
}

但现在问题来了:没有字符串 enum这样的东西,所以我不能用它来解析(例如,因为/RTP/AVP 中的 " " char ..)所以我必须定义额外的常量来切换解析媒体字段时通过媒体传输协议标志。

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

解析此类数据的最佳实践是什么?还是有类似字符串枚举的东西而我只是不知道?

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

3 回答 3

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('_', '/');
于 2013-07-16T07:59:10.930 回答
1

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

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

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

于 2013-07-16T08:02:27.753 回答
1

实际上,Name财产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在代码中使用 an 的优势。

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

于 2013-07-16T08:21:50.483 回答