我需要在各种类型(十进制,int32,int64等)之间进行转换,但我想确保我没有丢失任何数据。我发现正常的Convert
方法(包括转换)会在没有警告的情况下截断数据。
decimal d = 1.5;
int i = (int)d;
// i == 1
我想如果有转换或TryConvert方法,如果转换正在丢弃数据,则会抛出或返回false。我怎么能做到这一点?
如果可能,我想在一般意义上这样做,所以我可以在给定两个Type
对象和object
实例(其中运行时类型为convertFrom类型)的情况下完成所有操作。像这样:
object ConvertExact(object convertFromValue, Type convertToType)
{
if ( ** conversion not possible, or lossy ** )
throw new InvalidCastException();
// return converted object
}
与this question类似,但此处的数字会被截断。
答案 0 :(得分:6)
这个怎么样:
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine(ConvertExact(2.0, typeof(int)));
Console.WriteLine(ConvertExact(2.5, typeof(int)));
}
static object ConvertExact(object convertFromValue, Type convertToType)
{
object candidate = Convert.ChangeType(convertFromValue,
convertToType);
object reverse = Convert.ChangeType(candidate,
convertFromValue.GetType());
if (!convertFromValue.Equals(reverse))
{
throw new InvalidCastException();
}
return candidate;
}
}
请注意,这不是完美 - 例如,尽管 失去了信息,但它很乐意将2.000m和2.00m转换为2。精确)。但它并没有失去任何规模,这对你来说可能已经足够了。