Cast dynamique d'un objet [Résolu]

Signaler
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020
-
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
-
Salut

Comment fait on pour faire un cast dynamique en C# quand on recupere le type de l'objet avec getType() ?

thx @+

Herve

12 réponses

Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
61
Ou alors, tu peux vérifier le type et caster en fonction de ce type :

Voici un exemple avec une méthode appelée sur un clic d'un bouton ou lors d'un TextChanged d'une TextBox :

private

void DoSomething(
object sender,
EventArgs e)
{

   if (sender.GetType() ==
typeof(
Button))
   {

      Button b = (
Button)sender;
   }

   else
if (sender.GetType() ==
typeof(
TextBox))
   {

      TextBox t = (
TextBox)sender;
   }
   else
      throw
new
Exception(
string.Format(
"Unexpected type received : {0}",sender.GetType()));

}

Amicalement, SharpMao
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
61
Hello,

Je ne compred pas bien ce que tu veux faire.
En principe, le cast s'utilise pour assigner un objet d'un certain type, ou pour pouvoir accéder à des fonctions de cet objet :

int a = (int)o;
((DateTime)o).Year

Si tu ne connais pas à l'avance le type de ton objet, puisque tu le récupères de GetType, quel est l'avantage de faire du casting ?

Amicalement, SharpMao
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

En fait je passe par une fonction une objet de type X des objets qui sont derivés de X et j'aimerais pour les recuperer dans le bon objet ...

Herve
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
16
tu peux pas caster avec gettype....gettype te renvoi un objet de type "Type"...cest un objet...
si tu veux faire ce que tu dis (meme si jai du mal a voir lutilité), tu devra utiliser la généricité a priori
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
61
Oups, ce quwe je t'ai mis avant fonctionne, mais il y a plus joli, pour trouver le type :

if

(sender
is
Button)

Du moins, je trouve plus joli...

Amicalement, SharpMao
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Merci !!

Herve
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
61
Juste encore une chose,

Ce que t'ai montré fonctionne, mais s'il n'y a pas une très bonne raison de mettre ça dans la même méthode, je préférerai faire deux méthodes différentes si on ne peut pas utiliser le type X.

Amicalement, SharpMao
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Oui mais dans mon cas j'ai dis type differents pour le meme traitement ....

Herve
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
61
Oui, mais si le traitement est le même, tu n'as pas les bonnes propriétés sur la classe X ?

Si je reprend l'exemple ci-dessus, je peux caster sender en control et faire accéder à une bonne partie des propriétés et méthodes de Button et TextBox. Celles qui manquent sont en principe des propriétés spécifiques de la classe, et donc le traitement est différent.

Control c = (Control)sender;
c.Text // Fonctionne pour un bouton comme pour une TextBox.

Amicalement, SharpMao
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

ok ...

Herve
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Pour dire différement ce que dit SharpMao, si tu as un traitement "PerformTask" à faire sur tes objets, mais que ce traitement est différent selon le type d'objet, plutot que de faire le test tu type, et d'appliquer un traitement différent a chaque fois, c'est beaucoup plus propre et objet de passer par ce qu'on appelle la délégation :

Tu rajoute une méthode abstraite 'PerformTask" à ton objet de base X, et chaque type dérivé implémente le traitement à sa façon. Ensuite, dans ton code, tu obtiens un objet X et quelque soit sont "sous type", tu as juste à faire monObjet.PerformTask().
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
oui, je rejoins Nikoui, tu t'arranges pour que tes objets implémentent une interface (ITask par exemple) avec comme contrat l'implémentation de la méthode PerformTask.

ensuite dans ton code tu fais comme ceci :

ITask obj = monObject as ITask;
if (obj != null) {
   obj.PerformTask();
}

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]