Récupérer la valeur d'un attribut en fournissant son nom en paramètre

youssef_souissi Messages postés 1 Date d'inscription mardi 21 novembre 2006 Statut Membre Dernière intervention 1 juin 2008 - 1 juin 2008 à 12:40
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 8 juin 2008 à 10:19
j'ai une méthode qui prend en paramètre un objet de type Object. Cet objet peut être une instance de la classe "Client" ou "Fournisseur" par exemple. Ces deux classe possède des nom d'attributs différents.
public object lireValeur(Object obj,String nomClasse,String nomAttribut)
{
//est il possible de recupérer la valeur de l'attribut en paramètre.
}

Merci d'avance

5 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
1 juin 2008 à 13:30
Oulalala ça sens le bricolage par ici
Tu veux faire quoi exactement ?

<hr />
-My Blog-
0
didi2005 Messages postés 46 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 1 juillet 2008 1
2 juin 2008 à 00:17
Ah ça c'est super bien, tu veux travailler de façon générique c'est faisable biensur, c'est l'un de plus interressant question que j'ai vu sur ce forum.
Merci pour ta question voilà une idée.
tu auras besoin de la bibliothéque Reflection

using System.Reflection;
// obj : c'est votre objet que vous allez le passer en paramètre :
foreach( PropertyInfo Pi in obj.GetType().GetProperties())         
                {
            // Parcourir les attributs
                }
foreach( PropertyInfo Pi in obj.GetType().GetMethod ())         
                {
            // Parcourir les méthodes
                }
Vous pouvez même parcourir les constructeurs et les évenements etc ...
NB : Lors du parcours des attribut vous trouviez que leur type est de la façon suivante par exemple (int ==> System.int et string ==> System.string)
vous pouvez vous débarrasser de ça à l'aide de la méthode split() ou comme vous voulez.

j'éspère que j'ai pu vous répondre
Bonne continuation
i have a dream
0
WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 8
2 juin 2008 à 11:54
Salut,

Si par attributs tu entends propriétés, alors tu peux faire quelque chose comme ça:

Type t = obj.GetType();
System.Reflection.PropertyInfo pi = t.GetProperty(nomAttribut);
object val = pi.GetValue(o,null);
//à toi de faire un cast ici sur val

Sinon, pour les attributs de classe, je ne sais pas, mais ç'est sans doute lié à la réflexion aussi.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 juin 2008 à 10:14
Salut,

Oui, c'est toujours bien de prendre le risque d'utiliser une bombe H pour tuer une mouche.
Non sérieusement, si il s'agit de récupérer la valeur d'un attribut (champ) commun à la fois à Client et Fournisseur, on a depuis longtemps inventer le concept d'héritage, ou encore les interfaces.
Bref, sortir les mécanismes de Reflection pour éviter de faire une architecture correcte n'est pas franchement une bonne idée.

/*
coq
MVP Visual C#
CoqBlog
*/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 juin 2008 à 10:19
"NB : Lors du parcours des attribut vous trouviez que leur type est de la façon suivante par exemple (int ==> System.int et string ==> System.string)[...]"
Non.
Le mot clé C# int est un alias de System.Int32, System.int n'existe pas.
Le mot clé C# string est un alias de System.String, ou n'oublie pas la sensibilité à la casse.

"[...]vous pouvez vous débarrasser de ça à l'aide de la méthode split() ou comme vous voulez."
Ou sinon on arrête de tout développer à grand coup de chaînes de caractères, System.Type n'est pas fait pour être utilisé uniquement avec ToString.
Type.GetType et l'opérateur typeof sont cool aussi, et puis du coup pas besoin de cogiter avec les alias.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous