Récupérer la valeur d'un attribut en fournissant son nom en paramètre
youssef_souissi
Messages postés1Date d'inscriptionmardi 21 novembre 2006StatutMembreDernière intervention 1 juin 2008
-
1 juin 2008 à 12:40
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDerniè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.
}
didi2005
Messages postés46Date d'inscriptiondimanche 27 novembre 2005StatutMembreDernière intervention 1 juillet 20081 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
WishhhMaster
Messages postés327Date d'inscriptionmardi 17 février 2004StatutMembreDernière intervention10 avril 20108 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.
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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.
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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.