C# et la réflection

Résolu
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009 - 30 avril 2008 à 10:16
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009 - 30 avril 2008 à 15:45
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

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
30 avril 2008 à 11:29
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)
3
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
30 avril 2008 à 14:33
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)
3
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
30 avril 2008 à 15:28
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)
3
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009
30 avril 2008 à 14:18
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+
0

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

Posez votre question
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009
30 avril 2008 à 15:00
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 ?
0
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009
30 avril 2008 à 15:45
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 :)
0
Rejoignez-nous