2009-09-17 20 views
5

Tôi đang giao tiếp với .NET API trong IronPython. API trả về một đối tượng thuộc loại sai (một số loại đối tượng chung). Tôi nghi ngờ rằng vấn đề không hiển thị trong mã C# của họ vì khai báo kiểu khi đối tượng được xây dựng đang buộc đối tượng trả về cho đúng kiểu. Có thể typecast một đối tượng .NET trong IronPython? Tôi nghĩ rằng điều này sẽ làm các trick.bạn có thể định kiểu đối tượng .NET trong IronPython không?

+0

Bạn có thể giải thích thêm một chút không? Bạn có ý nghĩa gì bởi loại sai? – Rohit

+0

Có vẻ như IronPython luôn điền các thành viên của đối tượng theo loại "thực" của nó (vì nó sử dụng sự phản chiếu để xác định loại đó). Bạn có thể cho chúng tôi một ví dụ mà điều này không đứng? –

Trả lời

7

Để buộc một chuyển đổi bạn có thể làm:

import clr 
convertedObject = clr.Convert(someObject, someType) 

này sẽ tìm kiếm và chạy ngầm/chuyển đổi rõ ràng nếu có.

Lưu ý: có sẵn từ IronPython 2.6.

+1

Tôi không thể làm việc này. Tôi không thể tìm thấy một phương pháp "Chuyển đổi" trong clr IronPython của tôi. –

+0

'Chuyển đổi' gọi phương thức chuyển đổi rõ ràng/tiềm ẩn nếu có; nếu không có, nó trả về đối tượng không thay đổi. Nó không thể, ví dụ đưa một đối tượng vào loại cha của nó. –

+0

Nếu tôi cố gắng sử dụng điều này để đúc một UInt32 đến một Int16 tôi nhận được một OverflowException. Có cách nào để làm điều này hoạt động giống như một var y = (ngắn) x; đúc? – marcob

0

Tôi đã gặp sự cố tương tự đối với một dự án cách đây vài tháng. Đây là sửa chữa của tôi:

import clr 

clr.GetPythonType(x) 

x có thể là một loại NET hoặc một loại đó là trong một file dll mà bạn đã nhập khẩu sử dụng clr.

Tôi không phải là C# lập trình viên, nhưng tôi đã được thông báo bởi C# lập trình viên đồng nghiệp rằng mã này trong C# sẽ là:

typeof(x) 

Hope this helps

1

clr.Convert doesnt tồn tại trong IronPython 2.0 . Đây không phải là giải pháp để định kiểu đối tượng .NET trong IronPython ?, nhưng đó là giải pháp để chuyển đổi dữ liệu nếu bạn thực sự cần nó để sử dụng nó từ IronPython

Tạo một lớp như thế này trong VB.NET và biên dịch nó thành một DLL

Imports Microsoft.VisualBasic 

    Public Class MyConvert 

     Shared Function converttype(ByVal value As String) As Integer 
      Return CInt(value) 
     End Function 

    End Class 

sau đó, trong IronPython bạn làm

clr.AddReference('MyConvert') 
from MyConvert import converttype   
converted_value = converttype("2.0") 
0

Nếu bạn cần phải cast giá trị số một enum sử dụng sau đây, bởi vì các mã trên không làm việc cho sự đếm, nhưng chỉ cho tài liệu tham khảo các loại:

Enum.ToObject(CustomEnumType, value) 
Các vấn đề liên quan