私はこれで約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
Media Transport Protocolを表す proto フラグを見てください。仕様によると、このフィールドには次の値を指定できます。
- 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
) に出会いました: how can i use switch statement on type-safe enum pattern . この回答は、IMHOの醜いソリューションであっても、それらを切り替え可能にするソリューションについても説明しています。
ただし、これは定義された範囲でのみ機能します。解析中に検索できるインスタンスを格納するために辞書を使用してクラスを拡張しましたType Safe Enumeration
が、インスタンスがない場合は新しいインスタンスも追加しました。
しかし、他のすべての分野はどうですか?そして、キャスティングはどうですか?
この回答は、基本クラスを使用したアプローチと、明示的な演算子によるキャストについて説明しています: Casting string to type-safe-enum using user-defined conversion
やってみたのですが、思ったようにうまくいきません。(無効なキャスト例外、汚い 2 つのキャスト パターン、拡張不可)。
正しい SDP を作成できるライブラリを提供しながら、SDP 情報を正確かつ簡単に解析するにはどうすればよいでしょうか?