2012-05-07 58 views
8

我正在與DecimalConverterInt32Converter類,這似乎是返回的結果不一致的問題,通過以下簡單的控制檯程序所示:TypeConverters破壞了原始類型?

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 

除非我理解錯誤類型轉換器,下面應該成立:

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

應該給予同樣的結果

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

System.Int32System.Decimal的情況下,至少,他們沒有。

我的問題是這樣的:有人知道這是否是由設計?或者C#中的本機類型的TypeConverters實際上是否被破壞?

+2

我不明白爲什麼在反序列化JSON時需要將'int'轉換爲'decimal',因爲JSON包含字符串,而不是'int's。 – svick

+0

我擴大了我的問題來澄清。我意識到,我可以通過確保將所有東西序列化爲一個字符串到瀏覽器的方式來處理這個問題,但這不是真正的問題,更像是一個前奏。 – rossipedia

回答

2

按照MSDN documentation爲Int32Converter ...

此轉換器只能從一個字符串轉換爲32位有符號整數對象和 。

我同意@svick的評論,但是,我不明白爲什麼你需要首先通過Int32將一個JSON字符串反序列化爲十進制。

+0

我不知道。 ASP.NET MVC的默認JSON處理。當通過AJAX提交'application/json'請求時,默認的JavaScriptSerializer會將所有整數反序列化爲Int32對象。當系統試圖將這些Int32值映射回我的Model的'decimal'屬性時,我遇到了麻煩。 – rossipedia

+2

@BryanRoss你見過[這個StackOverflow的問題?](http://stackoverflow.com/questions/8964646/javascriptserializer-and-asp-net-mvc-model-binding-yield-different-results)我懷疑這是相當的類似於你的問題,因爲你需要傳遞你的小數作爲引用的字符串。 'JavaScriptSerializer'會錯誤地猜出類型,並根據錯誤的猜測嘗試不適當的轉換,但明確地引用這些值會嘗試一個字符串來轉換類型轉換,這應該是一個更加可行的解決方案。 –

+0

謝謝克里斯,我絕對同意你的觀點,實際上我已經達到了這個解決方案。我仍然想知道爲什麼TypeConverter不報告一致的功能。 – rossipedia

1

在這種情況下你根本不需要處理類型轉換器。如果你想反序列化模型類,這樣做:

serializer.Deserialize<Model>(json) 

而且很會照顧所有轉換的爲您服務。

如果您確實需要手動進行轉換,請使用Convert.ToDecimal(integer)(或Convert.ChangeType(integer, typeof(decimal))),它將正常工作。

+0

這不是我使用TypeConverters的代碼。這是ASP.NET MVC的。但是,問題是關於TypeConverters以及它們爲什麼會產生不一致的結果,而不是JSON序列化/反序列化。 – rossipedia

+0

那麼也許這不是你應該問的問題。我認爲你對JSON反序列化問題做錯了,這不是類型轉換器的錯。 – svick

+1

我發佈的示例程序與json無關,但它展現了我描述和詢問的行爲。正如我之前所說的,我的代碼實際上並沒有執行反序列化。它是ASP.NET MVC的代碼。由於我詢問的實際問題,JSON請求中未加引號的數值無法自動映射回小數屬性。不要在這裏粗魯,我完全知道如何解決我的特定JSON問題。這不是問題。我非常具體地詢問TypeConverters在原生數值類型方面的行爲。 – rossipedia