我遇到了DecimalConverter
和Int32Converter
类的问题,这些类似乎返回了不一致的结果,如以下简单的控制台程序所示:
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.Int32
和System.Decimal
的情况下,他们没有。
我的问题是:有人知道这是否符合设计要求?或者C#中的本机类型的TypeConverters实际上是否已损坏?
答案 0 :(得分:2)
根据Int32Converter的MSDN documentation ...
此转换器只能将32位有符号整数对象转换为和 从一个字符串。
我同意@svick的评论,但是,我不明白为什么你需要首先通过Int32将JSON字符串反序列化为Decimal。
答案 1 :(得分:1)
在这种情况下,您根本不需要处理类型转换器。如果要反序列化模型类,请执行以下操作:
serializer.Deserialize<Model>(json)
它将为您完成所有转换。
如果您确实需要手动进行转换,请使用Convert.ToDecimal(integer)
(或Convert.ChangeType(integer, typeof(decimal))
),它将正常运行。