2009-09-17 10 views
5

J'interface avec une API .NET dans IronPython. L'API retourne un objet du mauvais type (une sorte d'objet générique). Je soupçonne que le problème n'apparaît pas dans leur code C# parce que la déclaration de type lorsque l'objet est construit oblige l'objet retourné au type correct. Est-il possible de classer un objet .NET dans IronPython? Je pense que cela ferait l'affaire.pouvez-vous typecast un objet .NET dans IronPython?

+0

Pourriez-vous élaborer un peu plus? Que voulez-vous dire par mauvais type? – Rohit

+0

Il semble que IronPython peuple toujours les membres d'un objet en fonction de son type "réel" (puisqu'il utilise la réflexion pour déterminer ce type). Pouvez-vous nous donner un exemple où cela ne tient pas? –

Répondre

7

Pour forcer une conversion que vous pouvez faire:

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

Cela recherche et exécuter des conversions implicites/explicites si l'on existe.

Remarque: disponible depuis IronPython 2.6.

+1

Je n'arrivais pas à faire marcher ça. Je ne pouvais pas trouver une méthode "Convert" dans mon clr IronPython. –

+0

'Convert' appelle une méthode de conversion explicite/implicite s'il y en a une; s'il n'y en a pas, il renvoie l'objet inchangé. Il ne peut pas, par exemple, cast un objet à son type parent. –

+0

Si j'essaie d'utiliser ceci pour lancer un UInt32 sur un Int16, j'obtiens une exception OverflowException. Existe-t-il un moyen de faire cela qui fonctionne comme un var y = (short) x explicite; jeter? – marcob

0

J'ai eu un problème similaire sur un projet il y a quelques mois. Ce fut ma solution:

import clr 

clr.GetPythonType(x) 

x peut être un type .NET ou un type qui est dans un fichier dll que vous avez importé en utilisant clr.

Je ne suis pas un programmeur C#, mais on m'a dit par C# collègues de programmeur que ce code en C# serait:

typeof(x) 

Hope this helps

1

ne marche pas clr.Convert existent dans IronPython 2.0 . Ce n'est pas une solution pour transtyper un objet .NET dans IronPython ?, mais il est une solution de contournement pour convertir les données si vous avez vraiment besoin de l'utiliser de IronPython

Créer une classe comme ceci dans VB.NET et compiler dans une DLL

Imports Microsoft.VisualBasic 

    Public Class MyConvert 

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

    End Class 

Puis, en IronPython vous faire

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

Si vous devez convertir la valeur numérique à un enum utiliser ce qui suit, car le code ci-dessus fonctionne pas pour les énumérations, mais seulement pour référence types:

Enum.ToObject(CustomEnumType, value) 
Questions connexes