9

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は実際に壊れていますか?

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 に答える