2009-12-26 4 views
3

Avoir un paquet IronPython nommé "Entités". Ce paquet contient un fichier "Entity.py" qui définit une classe "Customer" et une classe "Address".Comment les noms d'espace de noms et d'assembly fonctionnent pour les types IronPython?

Si je lance ce programme:

customer = Customer() 
print customer.GetType().AssemblyQualifiedName 
address = Address() 
print address.GetType().AssemblyQualifiedName 

Je reçois cette sortie:

IronPython.NewTypes.System.Object_1$1, Snippets.scripting, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null 
IronPython.NewTypes.System.Object_1$1, Snippets.scripting, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null 

Comment ça marche? Pourquoi les deux types ont-ils le même nom de type (Object_1$1)?

Je dois utiliser une API qui nécessite le nom qualifié de l'assembly pour qu'un type crée des instances de ce type. Je voudrais pouvoir l'utiliser de cette façon:

customer = aFactory.Create("Entities.Customer, Entities"); 

Comment vais-je faire? Est-il possible de spécifier l'espace de noms et le nom d'assembly?

Merci

Répondre

5

Vous voulez regarder dans clrtype qui est nouveau dans IronPython 2.6. Il vous permet de contrôler le type qui est émis et il y a de bons échantillons avec des solutions pré-cuites dont l'une pourrait fonctionner ici.

La raison pour laquelle les types sont les mêmes est que IronPython a seulement besoin de faire autant avec le système de type .NET. Cela inclut le remplacement de toutes les méthodes virtuelles sur le type de base et l'implémentation des interfaces que vous avez demandées en les incluant dans votre liste de base. Autre que cela tous les types sont identiques et ils sont vraiment définis par des recherches dynamiques dans leur objet PythonType. Par exemple, dans Object_1 $ 1, nous définissons un remplacement de "ToString" qui recherchera dans l'ordre de résolution actuel de PythonType pour voir si ToString a été défini et si c'est le cas, nous l'invoquons. Cela permet aux membres PythonType de l'objet de changer lors de l'exécution et permet même au type Python réel de changer au moment de l'exécution. De plus, si nous ne faisions pas quelque chose comme ça, la définition de classes perdrait de la mémoire car les types .NET ne sont pas à collectionner.

+0

@Dino: Merci pour votre réponse. J'ai lu le lien que vous avez fourni. Il dit que "l'exemple ClrType disponible sur le site Web IronPython montre comment construire au-dessus du hook __clrtype__". Je ne peux pas trouver cet échantillon et Google ne peut pas non plus. Voulez-vous m'envoyer le lien vers cet échantillon s'il vous plaît? – Sylvain

+0

échantillon est disponible ici: http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=12482#DownloadId=96609 –

+0

@Dino: Merci, je vais vérifier cela. – Sylvain

Questions connexes