0

私は現在、Session Description Protocol (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
}

しかし、ここに問題があります: string enumのようなものはないので、これを解析に使用することはできません (たとえば/、RTP/AVP の " " char が原因で..) そのため、切り替えるためだけに追加の定数を定義する必要があります。メディア フィールドを解析するときのメディア トランスポート プロトコル フラグ。

DESCRIPTION各フィールドで " " 属性を使用することを検討しましたenumが、それを受け取るためだけに追加のメソッド/拡張メソッドを作成する必要がありますenum flag description(列挙型の説明属性を収集するのは簡単な作業ではありません)。

そのようなデータを解析するためのベスト プラクティスと考えられるものは何ですか? または、文字列列挙型のようなものがありますが、私はそれを認識していませんか?

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

3 に答える 3

2

いいえ。列挙型は本質的に int です。

いくつかの提案をさせてください。

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)。これを行う別の方法は、「/」文字をアンダースコア「_」に置き換えることです。次に、enum parse 関数を使用します。

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

トークンの文字セットが文字、場合によっては数字、スラッシュに限定されているという暗黙の前提を置いています。明らかに、A_B と A/B の形式の 2 つのトークンがあり、それらが異なると見なされる場合、これは問題になります。

于 2013-07-16T08:02:27.753 に答える
1

実際には、のNameプロパティDisplayAttributeがおそらく最善の方法です。これを使用した例は数多くあり、ドロップダウン コンボを設定するために頻繁に使用されます。

私が保持しているユーティリティ ライブラリには、このような関数が格納されています。つまり、関数を 1 回だけ作成する必要がありました。

どうしても属性を使用したくない場合は、ルックアップ用の辞書を作成することをお勧めします。

 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 属性から抽出し、メンバー名にフォールバックすることにより、静的コンストラクターでこの辞書を作成する静的ジェネリック クラスを作成することです。これは、リフレクションが列挙型ごとに 1 回だけ発生することを意味します。

于 2013-07-16T08:21:50.483 に答える