2013-07-16 74 views
0

我目前正在爲使用會話描述協議(SDP;請參閱:https://tools.ietf.org/html/rfc4566)提供的流信息編寫一個簡單的解析器。常量與枚舉有關的解析

對於各種領域,如始發媒體,存在可以具有不同的值的標誌。例如,在媒體字段媒體傳輸協議(見:https://tools.ietf.org/html/rfc4566#section-8.2.2

m=audio 49170 RTP/AVP 0 

原癌標誌(媒體傳輸協議)可以是 「RTP/AVP」, 「RTP/SAVP」 或 「UDP」根據規範。

因爲有許多值這個標誌可以有,這是適合使用的enum

public enum MediaTransportProtocol { 
    UDP, 
    RTP_AVP 
    RTP_SAVP 
} 

但現在這裏的問題:有一個字符串枚舉沒有這樣的事情,所以我不能使用這個進行解析(例如,因爲RTP/AVP中的「/」字符)。因此,我必須定義其他常量才能在解析媒體字段時切換媒體傳輸協議標誌。

我已經使用過的每個enum領域的「DESCRIPTION」屬性考慮,但後來我不得不只寫一個附加的方法/擴展方法來接收enum flag description(收集枚舉描述屬性是不是一個簡單的任務恕我直言)

解析這些數據的最佳做法是什麼?或者有沒有像字符串枚舉的東西,我只是沒有意識到它?

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

回答

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('_', '/'); 
+0

正如我已經提到的,我使用DESCRIPTION屬性來實現這一點。但是寫一個擴展方法,通過使用反射來獲取屬性等遍歷枚舉是很多工作,只是一個簡單的任務,像這樣。 – Atrotygma

+1

@Atrotygma,對不起,我錯過了這一點。老實說,我會說這是一個相當平凡的任務,就像一個小方法。無論如何,我沒有更簡單的解決方案) –

1

阿圖爾Udod有一個有趣的想法(#1)。另一種方法是使用下劃線'_'替換'/'字符。然後使用枚舉解析函數。

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

我做你的令牌字符集僅限於信件,可能數字和斜槓一個隱含的假設。顯然,如果有兩種形式A_B和A/B的令牌被認爲是不同的,這將是一個問題。

1

其實DisplayAttributeName屬性可能是最好的選擇。你會發現很多使用這個例子,經常填充下拉組合。

我使用的實用程序庫我保留了這樣的函數存儲在它裏面,這意味着我只需要編寫一次函數。

如果你急於不使用屬性,那麼你最好的選擇是爲你的查找創建一個字典。

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的優勢。

理想的解決方案就是我的庫所做的,就是創建一個靜態泛型類EnumHelper<T>,它在靜態構造函數中創建此字典,方法是反射枚舉以從Display屬性中提取,並返回到成員名稱上。這意味着每個枚舉類型只會發生一次反射。