如何从各种未知的数字类型转换为double

pho*_*ger 1 c#

我的代码将从各种数字类型的各种来源获取大量数据,这些数据都以类型形式到达object,为了便于使用,我想将它全部转换为double类型(这足以代表完整输入数据的范围,并且不需要极高的精度).我当然能够解决这个问题,但我的解决方案似乎很笨重....

  List<object> list = new List<object>();

  list.Add((int)42);
  list.Add((short)42);
  list.Add((float)42.1);
  list.Add((double)42.1);
  list.Add((decimal)42.1);

  foreach (object valObj in list)
  {
     Type objType = valObj.GetType();
     double value;

     if      (objType == typeof(int))     { value = (double)(int)valObj;     }
     else if (objType == typeof(short))   { value = (double)(short)valObj;   }
     else if (objType == typeof(float))   { value = (double)(float)valObj;   }
     else if (objType == typeof(double))  { value = (double)valObj;          }
     else if (objType == typeof(decimal)) { value = (double)(decimal)valObj; }
     else throw new Exception("Unexpected type");

     Console.WriteLine("Value: " + value);
  }
Run Code Online (Sandbox Code Playgroud)

我想做一些更简单的事情,但这不起作用......

  List<object> list = new List<object>();

  list.Add((int)42);
  list.Add((short)42);
  list.Add((float)42.1);
  list.Add((double)42.1);
  list.Add((decimal)42.1);

  foreach (object valObj in list)
  {
     double value = (double)valObj; // <--- exception of type 'System.InvalidCastException'

     Console.WriteLine("Value: " + value);
  }
Run Code Online (Sandbox Code Playgroud)

知道数据list类型中的所有数据都可以合法地被投射为(double),如何在(double)不首先投射的情况下将它们转换valObj为任何类型?

I.B*_*I.B 7

你可以用Convert.ToDouble().

foreach (object valObj in list)
{
    double value = Convert.ToDouble(valObj);
    Console.WriteLine("Value: " + value);
}
Run Code Online (Sandbox Code Playgroud)

Convert.ToDouble() 有许多重载,可以采取以下任何数据类型,

  • bool
  • byte
  • char
  • DateTime
  • decimal
  • double
  • float
  • int
  • long
  • object
  • sbyte
  • short
  • string
  • uint
  • ulong
  • ushort