2013-12-26 2 views
2

У меня есть Hashtable с результатами разбора определенного JSON: decodedJson. decodedJson["key"] может быть int, double, float, decimal или string. Мне нужно преобразовать его в десятичный, если это число (которое я планирую делать с (decimal)decodedJson["key"]), или обрабатывать ошибку, если это не так.Проверьте, можно ли применить объект к определенному типу значений?

Каков наиболее эффективный способ определить это?

ответ

5
if (decodedJson["key"] is decimal) 
{ 
//do your action 
} 
+1

Да, мы думаем одинаково :) –

2

Если объект десятичного вы можете сделать это

if (decodedJson["key"] is decimal) 
{ 
    //Your code here 
} 
+0

Мы думаем, что то же самое ... – Anarion

0

В соответствии с вопросом, если decodedJson ["key"] может быть любым из int, float, double, decimal или string. Нам нужно поставить чек для всех типов.

if(decodedJson["key"] is int || decodedJson["key"] is float || decodedJson["key"] is double || decodedJson["key"] is decimal) 
{ 
    decimal convereted_value = (decimal) decodedJson["key"]; 
    // Rest of your code here 
} 
else 
{ 
    // Error handling code here. 
} 
+1

Это опять-таки рискованно, учитывая, если тип 'int', вы не можете бросить в' десятичной типа. Класс «Convert» - лучший вариант. – nawfal

+0

Может быть, класс Convert - лучший вариант, но вы можете отличить int до десятичной, Посмотрите эту скрипку http://dotnetfiddle.net/khCkUt – NiralZaveri

+0

Niral, конечно, это возможно. Но вы не можете использовать его, когда тип значения помещен в коробку. Например, попробуйте: 'object i = 0; decimal d = (десятичный) i; ' – nawfal

0

Поскольку это может быть любой числовой тип, вы можете:

var i = decodedJson["key"]; 
bool isNumeric = i is byte || i is sbyte || i is short || i is ushort || 
       i is int || i is uint || i is long || i is ulong || 
       i is float || i is double || i is decimal; 

if (isNumeric) 
    Convert.ToDecimal(i); 
else 
    //handle 

Если вы хотите, чтобы преобразовать его к типу, который не является фактическим базовый тип, простой бросок не будет Работа. Convert класс имеет всесторонние тесты, которые ему понадобятся.


Или сделать его родовое весь путь, если вы хотите:

public static T To<T>(this object source) where T : IConvertible 
{ 
    return (T)Convert.ChangeType(source, typeof(T)); 
} 

public static bool IsNumeric(this Type t) 
{ 
    return t.In(typeof(byte), typeof(sbyte), typeof(short), typeof(ushort), 
       typeof(int), typeof(uint), typeof(long), typeof(ulong), 
       typeof(float), typeof(double), typeof(decimal)); 
} 

public static bool In<T>(this T source, params T[] list) 
{ 
    return list.Contains(source); 
} 

Или найти более точную версию IsNumerichere.

Итак, теперь вы звоните:

var i = decodedJson["key"]; 
if (i.GetType().IsNumeric()) 
    i.To<decimal>(); 
else 
    //handle 
Смежные вопросы