如何在不丢失任何数据的情况下在两种(数字)数据类型之间进行转换?

时间:2011-05-17 17:50:16

标签: c# .net

我需要在各种类型(十进制,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类似,但此处的数字会被截断。

1 个答案:

答案 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。精确)。但它并没有失去任何规模,这对你来说可能已经足够了。