C# et la réflection [Résolu]

Signaler
Messages postés
64
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
23 octobre 2009
-
Messages postés
64
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
23 octobre 2009
-
Bonjour,

Je viens vers vous pour avoir une petite explication sur la réflection. J'aimerais créer un objet A qui dérive un objet que nous dirons persistant.
Lorsque j'appelle une méthode de Persistant, j'aimerais vérifier le type, les méthodes etc. (Ca c'est bon), et ensuite voir comment se faire l'appel à une fonction particulière de l'object A.

Un peu de code pour expliquer tout ca :)

Ma classe persistante :

class Persistant
    {
        public Persistant()
        {
            // Un constructeur faudra voir ce qu'il fait :)
        }

        public void select(string param)
        {
            Console.WriteLine("Type : " + this.GetType());
            Program.frm.affiche("Type : " + this.GetType());
            
             // Vérification personnelles : Ca c'est bon
            Type t = this.GetType();
            TypeAttributes ta = t.Attributes;
           
            MemberInfo[] minfo =  t.GetMembers();
            MethodInfo[] mi = t.GetMethods();
            PropertyInfo[]pi = t.GetProperties();
            Type r = t.ReflectedType;
            FieldInfo[] fi = t.GetFields();
           
             // Recherche de la méthode setName de l'objetA.
            MethodInfo myMeth = t.GetMethod("setName");

            // Appelle de la méthode setName (J'ai vu un truc comme çà mais c'est là ou ca bloque)
            object[] o = new object[1];
            o[0] = "Deuxieme";
            myMeth.Invoke(t, o);

        }

Et mon objetA :

class ObjetA : Persistant
    {
        public int id;
        public string name;

        public ObjetA(int _id, string _name)
        {
            id = _id;
            name = _name;
        }

        public void setName(string _name)
        {
            name = _name;
        }
    }

Question : Comment faire pour appeller la méthode setName avec les bons paramètres  ?

Merci d'avance,

6 réponses

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

Je crois que je vois en tout cas une erreur :
myMeth.Invoke ne prend pas comme paramètre un type, mais l'instance elle-même.
Si j'ai bien compris ce que tu veux faire, ça donne donc : myMeth.Invoke(this, o);

Par contre, je me demande quel est le but de la manoeuvre. Un classe n'a pas à savoir qu'elle est héritée.
Que va-t-il se passer dans ta méthode 'select' si this n'est pas du type ObjectA, ou s'il n'a pas la méthode setName ?

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
64
Si toutes ces classe sont censées avoir les mêmes méthodes, pourquoi ne pas faire une classe abstraite ou une interface? C'est fait pour ça !

Amicalement, SharpMao

P.S. Et si la réponse est la bonne, n'oublie pas de cliquer sur le bouton, la réponse peut servir à d'autres personnes.

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
64
Hello,

Je pense toujours que ce serais plus simple et plus lisible avec des classes abstraites ou des interfaces.
Malgré tous, si tu veux accédes à une propriété , tu fais (de mémoire)

PropertyInfo myProp = t.GetProperty("...");

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
64
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
23 octobre 2009

Trop bien ;)
Merci beaucoup !

En fait je fais cela uniquement pour tester comment invoquer des méthodes d'un objet par réflexion. J'utiliserais cette méthode dans un système beaucoup plus complexe.

SetName est une méthode comme une autre (D'autres personnes auraient mis "toto"). Par la suite les objets dérivés de Persistant auront tous les mêmes méthodes. Le fait de passer par le Invoke permettra d'appeller la méthode dynamiquement sur l'objet utilisé (peut importe le type dérivé de Persistant).

Voilà pour les explications complémentaires ! :)

Encore merci SharpMao !

A+
Messages postés
64
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
23 octobre 2009

C'est une autre solution effectivemment. Mon but est ici de tester toutes les possibilités.

En ce qui concerne la réflection, quand je suis dans mon objet Persistant, y'a-t-il un moyen de demander la valeur d'un attribut précis sans passer par une méthode :

Exemple :

Je passe un objet Persistant en paramètre d'une autre fonction. Je sais par réflection que le type est un ObjetA et donc qu'il a un attribut "id" qui est un entier. Comment récupérer, modifier cette valeur sans faire
           
            MethodInfo myMeth = t.GetMethod("...");

Il est possible d'imaginer l'utilisation de get/set. Mais ce n'est pas une méthode puisqu'en C#, on la définirai

          public int Id{
                get { return this.id; }
                set { this.id = value; }
          }

Une idée ?
Messages postés
64
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
23 octobre 2009

Effectivemment, Bonne mémoire !

Je cherche à utiliser un ORM type ActiveRecord, mais j'ai lu que NHibernate ne supporte pas le Compact Framework. Donc je réfléchis à une alternative : Soit me retaper tout le code d'ActiveRecord, soit refaire un système perso...

D'ou toutes mes questions sur la reflection :)