2009-06-23 7 views
1

これは簡単な質問ですが、答えはありません。ここにシナリオと質問があります。TypeCodeの長さを取得する方法

特定の形式で格納された配列があります。フォーマットには、それに続く複数の詳細レコードを含むヘッダーレコードが含まれます。レコードのヘッダーには、データを格納するために使用されたTypeCode(たとえばInt32)が表示されます。

私は、バイト[]配列を取り、バイトデータをC#で正しい形式に変換するルーチンを持っています。このルーチンでは、変換を成功させるために適切なバイト数が必要です。

Q.どのようにすべての型の長さをハードコードすることなく変換関数に渡すために、指定されたTypeCodeからバイトの長さを取得できますか?

答えて

3

TypeCodeは固定値のセットを列挙したものであるため、それらの辞書を簡単にハードコーディングすることができます。

private static readonly Dictionary<TypeCode,int> TypeCodeLength = 
    new Dictionary<TypeCode,int> { 
    { TypeCode.Int32, 4 }, 
    { TypeCode.Int64, 8 }, 
    { TypeCode.Char, 2 }, 
    // etc 
} 

(同等のソリューションは、スイッチ/ case文を使用することです - あなただけの値を含めている場合、彼らは本当に同じです。)

一部、stringobjectのようなものの変数になります - と他のものはDateTimeのようなものをどのようにエンコードしているかに依存します。

これは標準的な変換を使用していない限り、フレームワークでは長さを指定できません。私はハードコーディングが一般的に悩まされていることを知っていますが、この場合、それは1つの場所にしかなく、最も簡単な選択肢になるでしょう。

+0

私は質問を誤解しているに違いありません。 :)この実装では、配列の最初の4バイトが型の長さを表すBSTRのようなモデルを使用するか、そのようなコンベンションを使用できるようです。 –

+0

もちろん、スイッチと同じように、新しいタイプが導入された場合、これは壊れます。 –

+0

新しいメンバを列挙型に導入することは、常に*変更を行うことです。私はTypeCode列挙型がいつでもすぐに変更されるとは思わない...マイクロソフトは、切り替えているすべての開発者のコ​​ードを壊したくないと思われる。 –

0

How to create Type from TypeCode...によれば(徹底的なスイッチなしで)行うことはできません。もちろん、もう一方の方向(Type-> TypeCode)は簡単です。

関連する問題