对于原始类型,TypeConverters是否已被破坏?

时间:2012-05-07 22:49:43

标签: c# .net typeconverter

我遇到了DecimalConverterInt32Converter类的问题,这些类似乎返回了不一致的结果,如以下简单的控制台程序所示:

using System;
using System.ComponentModel;

class App
{
    static void Main()
    {
        var decConverter = TypeDescriptor.GetConverter(typeof(decimal));
        Console.WriteLine("Converter: {0}", decConverter.GetType().FullName);
        Console.WriteLine("CanConvert from int to decimal: {0}", decConverter.CanConvertFrom(typeof(int)));
        Console.WriteLine("CanConvert to int from decimal: {0}", decConverter.CanConvertTo(typeof(int)));

        Console.WriteLine();

        var intConverter =  TypeDescriptor.GetConverter(typeof(int));
        Console.WriteLine("Converter: {0}", intConverter.GetType().FullName);
        Console.WriteLine("CanConvert from int to decimal: {0}", intConverter.CanConvertTo(typeof(decimal)));
        Console.WriteLine("CanConvert to int from decimal: {0}", intConverter.CanConvertFrom(typeof(decimal)));
    }
}

此输出如下:

Converter: System.ComponentModel.DecimalConverter
CanConvert from int to decimal: False
CanConvert to int from decimal: True

Converter: System.ComponentModel.Int32Converter
CanConvert from int to decimal: False
CanConvert to int from decimal: False

除非我不正确地理解TypeConverters,否则以下情况应该成立:

TypeDescriptor.GetConverter(typeof(TypeA)).CanConvertFrom(typeof(TypeB))

应该给出与

相同的结果
TypeDescriptor.GetConverter(typeof(TypeB)).CanConvertTo(typeof(TypeA))

至少在System.Int32System.Decimal的情况下,他们没有。

我的问题是:有人知道这是否符合设计要求?或者C#中的本机类型的TypeConverters实际上是否已损坏?

2 个答案:

答案 0 :(得分:2)

根据Int32Converter的MSDN documentation ...

  

此转换器只能将32位有符号整数对象转换为和   从一个字符串。

我同意@svick的评论,但是,我不明白为什么你需要首先通过Int32将JSON字符串反序列化为Decimal。

答案 1 :(得分:1)

在这种情况下,您根本不需要处理类型转换器。如果要反序列化模型类,请执行以下操作:

serializer.Deserialize<Model>(json)

它将为您完成所有转换。

如果您确实需要手动进行转换,请使用Convert.ToDecimal(integer)(或Convert.ChangeType(integer, typeof(decimal))),它将正常运行。