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

[Résolu]
Signaler
Messages postés
21
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
8 novembre 2006
-
Messages postés
21
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
8 novembre 2006
-
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

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
37
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#]
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
un tableau dobject tout simplement ne ferait pas laffaire?
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
37
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#]
Messages postés
21
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
8 novembre 2006

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
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
37
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#]
Messages postés
21
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
8 novembre 2006

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 :(
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
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
Messages postés
21
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
8 novembre 2006

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
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
37
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#]
Messages postés
21
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
8 novembre 2006

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!
Messages postés
21
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
8 novembre 2006

Merci pour votre aide, j'ai trouvé mon erreur