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

Messages postés
41
Date d'inscription
mardi 19 mai 2009
Dernière intervention
30 juin 2011
- - Dernière réponse : GranPicS
Messages postés
41
Date d'inscription
mardi 19 mai 2009
Dernière intervention
30 juin 2011
- 30 juin 2011 à 10:24
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!
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
107
Date d'inscription
samedi 25 novembre 2000
Dernière intervention
4 mai 2013
3
Merci
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 !

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 120 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Sehnsucht
Messages postés
12932
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 mars 2019
350
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
49
0
Merci
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
Commenter la réponse de sebmafate
Messages postés
835
Date d'inscription
samedi 15 novembre 2008
Dernière intervention
14 janvier 2017
23
0
Merci
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!
Commenter la réponse de cs_Robert33
Messages postés
12932
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 mars 2019
350
0
Merci
@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
Commenter la réponse de Whismeril
Messages postés
107
Date d'inscription
samedi 25 novembre 2000
Dernière intervention
4 mai 2013
0
Merci
@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 !
Commenter la réponse de Sehnsucht
Messages postés
12932
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 mars 2019
350
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
41
Date d'inscription
mardi 19 mai 2009
Dernière intervention
30 juin 2011
0
Merci
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.
Commenter la réponse de GranPicS

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.