Conteneur hétérogène en .NET 1.1 ?

Résolu
byphantom Messages postés 21 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 8 novembre 2006 - 6 sept. 2006 à 18:21
byphantom Messages postés 21 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 8 novembre 2006 - 8 sept. 2006 à 09:56
Bonjour
Je souhaite sotcker des objets de types différents dans la même list, le pb est que meme si je fais hérité tout le monde d'une interface et que je les cast vers l'interface à chaque ajout. quand je les recupere, ils ont le type dynamique du premier objet inséré. donc je perds l'info sur le type de l'objet.
Est-ce que vous avez une idée d'un conteneur que je peux utiliser ou comment faire un conteneur hétérogène qui fait ça?
Merci de votre aide!

11 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 38
7 sept. 2006 à 11:17
nan... l'arraylist stocke des System.Object !

donc si tu fais :

IModule module1 = Activator.CreateInstance(monType1); // Module1
IModule module2 = Activator.CreateInstance(monType2); // Module2

et que tu les ajoutes à ton arrayList :
arrayList.Add(module1);
arrayList.Add(module2);

à la fin tu te retrouves avec les mêmes choses !
(IModule)arrayList.Items[0]; // <-- ici tu accèdes aux méthodes et propriétés de l'interface...
(Module1)arrayList.Items[0]; // <-- et là à ceux de l'objet !

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
3
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
6 sept. 2006 à 19:36
un tableau dobject tout simplement ne ferait pas laffaire?
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 38
6 sept. 2006 à 20:22
et pourquoi pas une ArrayList... c'est un p'tit peu fait pour ca... non ?

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
byphantom Messages postés 21 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 8 novembre 2006
7 sept. 2006 à 09:31
l'ArrayList est celle que j'utilise. Apparement elle n'est hétérogène qu'en .NET 2.0 c'est pour ça que je fais appel à vous
Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 38
7 sept. 2006 à 09:51
nan... l'arraylist permet de mettre tout et n'importe quoi dedans...
je pense que ton problème vient du fait que tu cast à l'entrée et non à la sortie !

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
byphantom Messages postés 21 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 8 novembre 2006
7 sept. 2006 à 09:59
je cast dans les deux. je peux mettre tout ce que je veux, je susi d'accord. mais je peux pas récupérer le bon type que j'ai mis. Exemple :
une Interface IModule
et deux classe :
Module1 : IModule et Module2 : IModule
je déclare mon tableau : ArrayList list = new ArrayList();
je fais :
IModule md1 = new Module1();
IModule md2 = new Module2();

list.Add((IModule)md1);

list.Add((IModule)md2);

et quand je récupère le second je vois (en débuggant) que md2 est de type Module1, et ceci parce que l'ArrayList s'attend à des objets du type du premier objets insérés et donc il cast apparement tout le monde vers ce type :(
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
7 sept. 2006 à 10:23
Salut,
Bon, déjà, dans le Add, pas besoin de caster =>

list.Add(md1);
list.Add(md2);

Ensuite, l'ArrayList est faite pour stocker n'importe quel type d'object, c'est d'ailleurs pour cette raison qu'elle prend des objects en argument. Donc c'est toi qui fait une mauvaise manipulation ;-)

Est-ce que par hasard Module2 dériverait de Module1 ?
Quoi qu'il en soit, c'est clair que tu peux sans autre fait un get sur ton ArrayList, choisir l'élément 1 (c'est à dire le deuxième), ça va te retourner un object que tu pourras sans autre caster en Module 2...

<hr size="2" />VC# forever
0
byphantom Messages postés 21 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 8 novembre 2006
7 sept. 2006 à 10:34
je sais pour le cast, mais c'était juste pour être sur que l'ArrayList prend comme type IModule
non le smodules dérivent de l'interface, en fait j'utilise ça pour faire des plug-ins à mon appli. donc je ne sais pas de quel type est mon objet module, tout ce que je sais est qu'il implemente mon interface IModule, c'est pour ça que quand je récupère par le biais du Get mes objets je les recast vers IModule, mais le pb est que leur type dynamique change et je ne comprends pas pourquoi.
j'ai cherché sur internet mais je trouve pas de oslution. j'ai demandé à qq et il m'a dit que c'est juste dans la version 1.1 et que dans le 2.0 ça marche très bien. mais je ne peux pas utiliser le 2.0, donc je cherche une solution pour contourner ce pb
merci pour tes réponses
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 38
7 sept. 2006 à 10:47
en gros... ce qu'il faut faire :

Module1 module1 = new Module1();
Module2 module2 = new Module2();

tu fais :
arrayList.Add(module1);
arrayList.add(module2);

et tu récupère comme ceci :

(IModule)arrayList.Items[0]; // module1
(IModule)arrayList.Items[1]; // module2

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
byphantom Messages postés 21 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 8 novembre 2006
7 sept. 2006 à 11:00
En fait voilà comment ça marche :
mes plug-ins sont des dll, j'ai obligatoirement une classe qui me donne l'info sur le type du plug-in. donc je charge la dll, je récupère l'info et je fais appel à assembly.CreateInstance en lui passant le type du plug-in (qui est module1 par exemple). donc je ne peux pas déclarer une variable du type Module1 pour stocker l'objet retourné par assembly.CreateInstance, et donc comme je sais qu'il hérite de mon interface ma variable est déclérée du type de l'interface. mais dynamiquement l'objet est de type Module1

Le pb est que la classe ArrayList change le type dynamique des objets qui y sont insérés même si je les fais hérité d'une interface et que je les insère en tant que des types de l'interface.

Je ne sais si vous voyez mieux le pb?
Merci de votre aide!
0
byphantom Messages postés 21 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 8 novembre 2006
8 sept. 2006 à 09:56
Merci pour votre aide, j'ai trouvé mon erreur
0