2


1

16進文字列を動的なプリミティブ型に変換する

次のようなコードがあります。

        string hexString = "0x00000004";
        Type hexType = typeof(Int32);

        object o = Convert.ChangeType(hexString, hexType);

Convert.ChangeTypeが16進値で機能しないため、実行されるとすぐに* System.FormatException *をスローします。

私の他の選択肢は、これらのいずれかを使用しています:

  • * Int32 * .Parse

  • Convert。* ToInt32 *

ただし、特定のタイプに適用されるため、* switch * / reflectionを使用して、適切なタイプの適切な機能を選択する必要があります。

私はこれらのオプションのいずれについても本当に興奮していません。 他にできることはありますか?

1 Answer


2


通常、16進数は整数にのみ使用されるため、http://msdn.microsoft.com/en-us/library/zkw23d3e.aspx [parse]文字列を最大整数型(Int64)およびhttp:// msdnに変換できます。 .microsoft.com / en-us / library / dtb69x08.aspx [change]結果のタイプを目的のタイプに変更します。

string hexString = "deadcafebabe0000";
long hexValue = long.Parse(hexString, NumberStyles.AllowHexSpecifier);

Type hexType = typeof(Int32);
object o = Convert.ChangeType(hexValue, hexType);

(文字列をParseメソッドに渡す前に、 `0x`プレフィックスを取り除く必要があることに注意してください。)

'' '' '

Convert.ChangeTypeは本質的に「if(type == …​)…​ else if(type == …​) `ステートメント。 すべての整数型をそれぞれのhttp://msdn.microsoft.com/en-us/library/zkw23d3e.aspx[Parse]メソッドにマップする辞書を作成できます。

var dict = new Dictionary>
{
    { typeof(byte),   s => byte.Parse(s, NumberStyles.AllowHexSpecifier) },
    { typeof(sbyte),  s => sbyte.Parse(s, NumberStyles.AllowHexSpecifier) },
    { typeof(short),  s => short.Parse(s, NumberStyles.AllowHexSpecifier) },
    { typeof(ushort), s => ushort.Parse(s, NumberStyles.AllowHexSpecifier) },
    { typeof(int),    s => int.Parse(s, NumberStyles.AllowHexSpecifier) },
    { typeof(uint),   s => uint.Parse(s, NumberStyles.AllowHexSpecifier) },
    { typeof(long),   s => long.Parse(s, NumberStyles.AllowHexSpecifier) },
    { typeof(ulong),  s => ulong.Parse(s, NumberStyles.AllowHexSpecifier) },
};

string hexString = (-5).ToString("X");
Type hexType = typeof(Int32);
object o = dict[hexType](hexString);