Acceder aux méthodes d'un objet dans une Arraylist [Résolu]

Signaler
Messages postés
41
Date d'inscription
mardi 19 mai 2009
Statut
Membre
Dernière intervention
30 juin 2011
-
Messages postés
41
Date d'inscription
mardi 19 mai 2009
Statut
Membre
Dernière intervention
30 juin 2011
-
Bonjour à tous,

Voilà mon problème :
J'aimerai modifier les valeurs des attributs de mes objets en fonction du résultat d'une requête SQL. Ces objets sont stockés dans une ArrayList d'objets "CCase". CCase est une classe que j'ai écrite auparavant.
Or je n'ai pas accès aux méthodes de mes objets.

J'ai une Arraylist d'objet CCase appelé ListeCase
J'ai donc essayé :

...
for (int i = 0; i < myDataTable.Rows.Count; i++)
{
monNumCase = Convert.ToInt32(myDataTable.Rows[i]["numCase"]);
monType = myDataTable.Rows[i]["type"].ToString();
monNumPorte = Convert.ToInt32(myDataTable.Rows[i]["numPorte"]);
monNumMap = Convert.ToInt32(myDataTable.Rows[i]["numMap"]);

(CCase)ListeCase[i].setNumCase(numCase);
(CCase)ListeCase[i].setNumType(monType);
(CCase)ListeCase[i].setNumPorte(numPorte);
(CCase)ListeCase[i].setNumMap(numMap);

}
Mais "(CCase)ListeCase[i].setNumCase(numCase);" ne marche pas car la méthode setNumCase (ainsi que toutes les autres méthodes de la classe CCase) ne sont pas accessible.
Auriez vous une solution???

Merci d'avance!

8 réponses

Messages postés
107
Date d'inscription
samedi 25 novembre 2000
Statut
Membre
Dernière intervention
4 mai 2013

Bonjour,

+1 pour l'utilisation de List<T>

Je suggèrerais également de revoir les propriétés en C#, parce que les méthode setXXX devrait sûrement en être et peut-être aussi les conventions de nommages parce que préfixer d'un C les noms de classe, ne sert pas à grand chose, sauf consigne imposée (dans ce cas c'est la consigne qui est stupide à mon goût)...

@sebmafate :
Dans le cas présent, je conserverais plutôt le cast de whismeril plutôt que le recours à l'opérateur as, en effet il n'ont sémantiquement pas la même signification :
"as" veut plutôt dire, ça je sais pas trop ce que ça peut être, tente le coup je testerais la valeur de retour.
(Type) signifie quant à lui, je certifie que cet objet est bien de ce type, et je suis prêt à le garantir ; dans le cas contraire, c'est pas normal, je préfère lever une exception.
(Après c'est plus un avis personnel totalement subjectif, mais j'évite les var quand on peut aisément les remplacer, quitte à utiliser un alias dans mes clauses using pour les types à rallonge).

Cordialement !
Messages postés
14596
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 août 2020
426
Bonjour,
je ne me sers pas d'ArrayList donc mon idée n'est peut-être pas bonne, mais as tu essayé ça:
(CCase)MonCCase = ListeCase[i];
MonCCase.setNumCase(numCase); 
MonCCase.setNumType(monType); 
MonCCase.setNumPorte(numPorte); 
MonCCase.setNumMap(numMap); 
ListeCase[i] = MonCCase;


Sinon, moi je me sers de listes d'objets
List<CCase>Malist = new List<CCase>();
qui permettent d'accéder aux propriétés de mes objets (donc je suppose aux méthodes aussi).

Whismeril
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
Hello...

houla whismeril :
var MonCCase = ListeCase[i] as CCase;
MonCCase.setNumCase(numCase); 
MonCCase.setNumType(monType); 
MonCCase.setNumPorte(numPorte); 
MonCCase.setNumMap(numMap); 
// ListeCase[i] = MonCCase; pas nécessaire... MonCCase est un pointeur vers ListCase[i]


De manière générale, il est préférable d'utiliser une List<CCase>



Sébastien FERRAND
Ingénieur Concepteur Senior
Microsoft Visual C# MVP 2004 - 2009
Blog Photo
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
28
Bonjour

Si, je cite " "(CCase)ListeCase[i].setNumCase(numCase);" ne marche pas car la méthode setNumCase (ainsi que toutes les autres méthodes de la classe CCase) ne sont pas accessible. "

Alors quelque soit la méthode employée, les propriétés de l'objet resteront inaccessibles.


Bob.
C# is amazing, enjoy it!
Messages postés
14596
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 août 2020
426
@Sebmafate houla oui, j'étais peut être pas assez réveillé....
Je voulais écrire
MonCCase (CCase)ListeCase[i];
mais
var MonCCase ListeCase[i] as CCase;
c'est mieux.

Whismeril
Messages postés
107
Date d'inscription
samedi 25 novembre 2000
Statut
Membre
Dernière intervention
4 mai 2013

@Robert33 :

Non le code initial aurait pu fonctionner, c'est juste une histoire de priorité d'opérateur
((CCase)ListeCase[i]).setNumCase(numCase);

voir ici pour plus d'infos sur les opérateurs et leurs priorités.

Cordialement !
Messages postés
14596
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 août 2020
426
Bon, si ma proposition ou celle de Sebmafate, peut être y a t il un problème dans CCase.
Les méthodes sont elles déclarées "public"?


Whismeril
Messages postés
41
Date d'inscription
mardi 19 mai 2009
Statut
Membre
Dernière intervention
30 juin 2011

Merci a tous pour vos reponses!
J'ai essaye avec une List<T> et cela fonctionne parfaitement bien merci.
En plus, comme les List<T> possedent les meme methodes que les arraylist(Add, Sort, Clear...) je n'ai eu qu'a changer la declaration de "ListeCase" sana toucher au reste du code.

Pour Sehnsucht, si j'ai prefixe le nom de ma classe avec un C c'est parce que le terme "case" est reserve pour les switchs me semble t-il... J'avais deja eu le probleme une fois en Java avec Eclipse donc j'imagine que c'est la meme chose sur VS. De plus, Ce n'est pas une consigne imposee car c'est du developpement perso.

Desole pour les accents mais je suis a l'etranger et j'ecris sur un clavier QWERTY.