Reflection sur une méthode statique

Résolu
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009 - 14 mai 2008 à 11:27
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 17 mai 2008 à 23:16
Bonjour à tous,

Je viens vers vous pour une question concernant la réflection.

Lorsque j'appelle une méthode normalement (non statique) je peux récupérer l'instance de l'objet appelant en faisant utilisant le mot clé "this" .

Mon soucis, est que j'aimerais bien récupérer l'objet appelant quand j'appelle une méthode statique. Par exemple, je fais
   
    ObjetA.maMethodeStatique(params);

Comment dans la fonction maMethodeStatique() je peux savoir que l'objet appellant est de type ObjetA.

Cela me servira à récupérer les attributs de l'ObjetA via la reflection.

Merci d'avance.

5 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
14 mai 2008 à 12:17
Hello,

Je crois que tu n'as pas très bien compris le mot clef static.
Une méthode statique n'appartient pas à un objet, mais à la classe elle-même.
Il n'existe donc pas d'instance appelant cette méthode.

Noramlement, pour appeler une méthode statique, on ne fait pas

ObjetA.maMethodeStatique(params);
mais

TypeA.maMethodeStatique(params);

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
14 mai 2008 à 12:24
Hum je me suis mal exprimé.
Je sais bien ce que signifie la méthode statique.

ObjetA est la nom de ma classe. C'est pour cela qu'on s'est mal compris.

Si je reprends ta notation, tu fais un TypeA.maMethodeStatique(params);

Admettons que mon modèle soit fait de la manière suivante :

- Une classe Types : qui contient la méthode statique ;
- Une classe TypeA et une classe TypeB qui héritent tous deux de la classe Types ;

Ma question est comment savoir que c'est le TypeA qui appelle la méthode statique de Types et non la classe TypeB ?

Note : Je suis sous le Compact Framework 2.0
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
14 mai 2008 à 13:34
Hello,

Je me trompe peut-être, mais je ne pense pas que ce soit possible.
Si ta méthode statique n'est pas surchargée, c'est la méthode de la classe de base qui est directement appelée, et je ne crois aps que tu puisses rettrouver cette info.
J'ai jeté un coup d'oeil dans System.Reflection.MethodBase et dans System.Diagnostic.StackTrace, mais sans succès.

Mais comme je l'ai déjà dis, je me trompe peut-être

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009
14 mai 2008 à 13:53
Aie... Je continue mes recherches, et si j'ai des nouvelles, je viendrais poster ici ;)
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
17 mai 2008 à 23:16
Salut,

Si on peut, et justement avec ce dont SharpMao a parler mais bon, je me demande si c'est vraiment une bonne idée, surtout si l'utilisation de la méthode est intensive.
Sans parler du fait que le type "Types" aura ainsi une dépendance directe sur le type "TypeA", ce qui du coup est un peu (beaucoup) moche.

Bref, à titre informatif (à stabiliser etc) (et donner une description compréhensible :p) :
    /// <summary>
    /// Obtient l'instance de <see cref="Type"/> représentant le type déclarant la méthode appelant l'appelant de <see cref="GetCallerType"/>.
    /// </summary>
    /// <returns></returns>
    private static Type GetCallerType()
    {
      Type callingType = null;


      try
      {
        // TODO : Faire une gestion d'erreur appropriée à l'utilisation
        // TODO : valider les indexes etc etc
       
        // Obtention de la stack
        StackTrace stack = new StackTrace();


        // Obtention de la frame qui nous intéresse : 2, comme nous voulons l'appelant de notre appelant
        StackFrame callerFrame = stack.GetFrame(2);


        // Obtention de la méthode appelante
        MethodBase callingMethod = callerFrame.GetMethod();


        // Récupération de l'instance de Type représentant le type déclarant la méthode
        callingType = callingMethod.DeclaringType;
      }
      catch
      {
        // TODO : Faire une gestion d'erreur appropriée à l'utilisation
      }
     
      return callingType;
    }

...

Type callingMethodDeclaringType = GetCallerType();


if (callingMethodDeclaringType == typeof(TypeA))
{
  // yep
}
else
{
  // non
}

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