9

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

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 是否真的损坏了?

4

2 回答 2

2

根据Int32Converter的MSDN 文档...

此转换器只能将 32 位有符号整数对象与字符串转换。

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

于 2012-05-07T23:10:02.403 回答
1

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

serializer.Deserialize<Model>(json)

它会为您处理所有转换。

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

于 2012-05-08T00:35:44.187 回答