Cast dynamique d'un objet [Résolu]

Messages postés
567
Date d'inscription
mardi 30 avril 2002
Dernière intervention
24 janvier 2014
- - Dernière réponse : sebmafate
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
- 19 janv. 2007 à 13:40
Salut

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

thx @+

Herve
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
3
Merci
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

Merci SharpMao 3

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

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de SharpMao
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
1
Merci
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
Commenter la réponse de SharpMao
Messages postés
567
Date d'inscription
mardi 30 avril 2002
Dernière intervention
24 janvier 2014
0
Merci
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
Commenter la réponse de Seth77
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
0
Merci
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
Commenter la réponse de leprov
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
0
Merci
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
Commenter la réponse de SharpMao
Messages postés
567
Date d'inscription
mardi 30 avril 2002
Dernière intervention
24 janvier 2014
0
Merci
Merci !!

Herve
Commenter la réponse de Seth77
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
0
Merci
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
Commenter la réponse de SharpMao
Messages postés
567
Date d'inscription
mardi 30 avril 2002
Dernière intervention
24 janvier 2014
0
Merci
Oui mais dans mon cas j'ai dis type differents pour le meme traitement ....

Herve
Commenter la réponse de Seth77
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
0
Merci
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
Commenter la réponse de SharpMao
Messages postés
567
Date d'inscription
mardi 30 avril 2002
Dernière intervention
24 janvier 2014
0
Merci
ok ...

Herve
Commenter la réponse de Seth77
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Dernière intervention
19 août 2008
0
Merci
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().
Commenter la réponse de Nikoui
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
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]
Commenter la réponse de sebmafate

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.