2010-09-10 2 views
1

У меня есть следующий код:Преобразование шестнадцатеричной строки в динамический примитивный тип

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

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

Который бросает System.FormatException как только он выполнен в виде, Apparantly, Convert.ChangeType не может работать с шестнадцатеричным значения.

Мои другие альтернативы используют либо из них:

  • Int32 .Parse
  • Преобразовать. ToInt32

Однако, поскольку они применяются для определенного типа, я должен буду использовать переключатель/отражение, чтобы выбрать правильную функцию для правильного типа.

Я не очень взволнован ни одним из этих вариантов. Есть ли что-нибудь еще, что я могу сделать?

ответ

2

С шестнадцатеричным обычно используются только для целых чисел, вы можете parse строку до наибольшего целого типа (Int64) и change типа результата к нужному типу:

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

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

(Обратите внимание, что вы нужно вырезать префикс 0x перед передачей строки в метод синтаксического разбора.)


Convert.ChangeType, по существу, большая куча if (type == ...) ... else if (type == ...) заявлений. Вы можете создать словарь, который отображает все целые типы их соответствующего Parse способа:

var dict = new Dictionary<Type, Func<string, object>> 
{ 
    { 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); 
+1

@VitalyB: Отрицательные числа шестнадцатеричных являются уродливым углом так, потому что они не представлены с '-' знак (основание 16) а в дополнении «Два». Это означает, что вам нужно проанализировать строку, используя тот же тип, что и исходное значение. – dtb

+0

Я надеялся на что-то более встроенное. Ну, я думаю, я пойду с этим. Благодаря! – VitalyB

Смежные вопросы