Cast dynamique d'un objet [Résolu]

Seth77 567 Messages postés mardi 30 avril 2002Date d'inscription 24 janvier 2014 Dernière intervention - 19 janv. 2007 à 10:22 - Dernière réponse : sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention
- 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 

12 réponses

Répondre au sujet
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 19 janv. 2007 à 11:03
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de SharpMao
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 19 janv. 2007 à 10:36
+1
Utile
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
Seth77 567 Messages postés mardi 30 avril 2002Date d'inscription 24 janvier 2014 Dernière intervention - 19 janv. 2007 à 10:42
0
Utile
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
leprov 1163 Messages postés vendredi 23 juillet 2004Date d'inscription 21 octobre 2010 Dernière intervention - 19 janv. 2007 à 10:54
0
Utile
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
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 19 janv. 2007 à 11:05
0
Utile
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
Seth77 567 Messages postés mardi 30 avril 2002Date d'inscription 24 janvier 2014 Dernière intervention - 19 janv. 2007 à 11:06
0
Utile
Merci !!

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

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

Herve
Commenter la réponse de Seth77
Nikoui 794 Messages postés vendredi 24 septembre 2004Date d'inscription 19 août 2008 Dernière intervention - 19 janv. 2007 à 12:06
0
Utile
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
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 19 janv. 2007 à 13:40
0
Utile
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.