2012-05-07 46 views
8

Tôi đang chạy vào một vấn đề với DecimalConverterInt32Converter lớp học, mà dường như được trở về kết quả không phù hợp, như chứng minh bởi các chương trình sau đây đơn giản giao diện điều khiển:Loại Biến tần bị hỏng cho các kiểu nguyên thủy?

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))); 
    } 
} 

Kết quả từ này như sau:

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 

Trừ khi tôi hiểu TypeConverters không đúng, sau đây nên giữ đúng:

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

nên cho kết quả tương tự như

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

Ít nhất là trong trường hợp của System.Int32System.Decimal, họ không.

Câu hỏi của tôi là: Có ai biết nếu điều này là do thiết kế? Hoặc là TypeConverters cho các loại bản địa trong C# thực sự bị hỏng?

+2

Tôi không hiểu làm thế nào bạn cần phải chuyển đổi 'int' thành' thập phân' khi deserializing JSON, vì JSON chứa chuỗi chứ không phải 'int'. – svick

+0

Tôi đã mở rộng câu hỏi của mình để làm rõ. Tôi nhận ra rằng tôi có thể xử lý điều này bằng cách đảm bảo rằng tôi sắp xếp mọi thứ như một chuỗi trên đường xuống trình duyệt, nhưng đó không thực sự là câu hỏi, một khúc dạo đầu hơn. – rossipedia

Trả lời

2

Theo MSDN documentation cho Int32Converter ...

chuyển đổi này chỉ có thể chuyển đổi một 32-bit đã ký đối tượng số nguyên đến và từ một chuỗi.

Tôi đồng ý với @svick trong nhận xét, tuy nhiên, tôi không hiểu tại sao bạn cần phải deserialize chuỗi JSON thông qua Int32 thành số thập phân ngay từ đầu.

+0

Tôi thì không. Xử lý JSON mặc định của ASP.NET MVC. Khi gửi một yêu cầu 'application/json' thông qua AJAX, mặc định' JavaScriptSerializer' sẽ deserialize tất cả các số nguyên là các đối tượng Int32. Tôi gặp sự cố khi hệ thống cố gắng ánh xạ các giá trị Int32 đó trở lại thuộc tính 'thập phân' của Mô hình của tôi. – rossipedia

+2

@BryanRoss Bạn đã thấy [câu hỏi StackOverflow này chưa?] (Http://stackoverflow.com/questions/8964646/javascriptserializer-and-asp-net-mvc-model-binding-yield-different-results) Tôi nghi ngờ rằng nó khá tương tự như vấn đề của bạn, trong đó bạn cần phải chuyển số thập phân của bạn thành chuỗi được trích dẫn. 'JavaScriptSerializer' sẽ đoán loại không chính xác và kết thúc cố gắng chuyển đổi không phù hợp dựa trên phỏng đoán xấu của nó, nhưng trích dẫn rõ ràng các giá trị sẽ thử một chuỗi để nhập chuyển đổi phải là giải pháp khả thi hơn. –

+0

Cảm ơn Chris, tôi chắc chắn đồng ý với bạn, và thực sự tôi đã đến giải pháp này. Tôi vẫn muốn biết tại sao TypeConverter không báo cáo các khả năng nhất quán. – rossipedia

1

Bạn không cần phải đối phó với các trình chuyển đổi loại trong các trường hợp như thế này. Nếu bạn muốn deserialize lớp mô hình của bạn, làm một cái gì đó như:

serializer.Deserialize<Model>(json) 

Và nó sẽ chăm sóc của tất cả các chuyển đổi cho bạn.

Nếu bạn thực sự cần thực hiện chuyển đổi theo cách thủ công, hãy sử dụng Convert.ToDecimal(integer) (hoặc Convert.ChangeType(integer, typeof(decimal))) và nó sẽ hoạt động chính xác.

+0

Nó không phải là mã của tôi đang sử dụng TypeConverters. Đó là ASP.NET MVC. Tuy nhiên, câu hỏi đặt ra là về TypeConverters và tại sao chúng tạo ra các kết quả không phù hợp, không phải là chuỗi tuần tự hóa/deserialization JSON. – rossipedia

+0

Sau đó, có lẽ đó không phải là câu hỏi mà bạn nên hỏi. Tôi nghĩ rằng bạn đang làm một cái gì đó sai liên quan đến JSON deserialization, nó không phải là lỗi chuyển đổi loại '. – svick

+1

Chương trình mẫu mà tôi đã đăng không liên quan gì đến json, nhưng nó thể hiện hành vi mà tôi đã mô tả và hỏi về. Và như tôi đã nói trước đây, mã của tôi không thực sự thực hiện deserialization. Đó là mã của ASP.NET MVC. Giá trị số không được phép trong yêu cầu JSON không thể được ánh xạ trở lại một thuộc tính thập phân tự động, do vấn đề thực tế mà tôi đã hỏi. không cố gắng thô lỗ ở đây, tôi hoàn toàn nhận thức được cách khắc phục vấn đề JSON cụ thể của mình. Nó không phải là một vấn đề. Tôi hỏi rất cụ thể về hành vi của TypeConverters liên quan đến các loại số nguyên bản. – rossipedia

Các vấn đề liên quan