Reflection sur une méthode statique [Résolu]

t00f 64 Messages postés lundi 21 avril 2008Date d'inscription 23 octobre 2009 Dernière intervention - 14 mai 2008 à 11:27 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 14 mai 2008 à 12:17
3
Merci
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)

Merci SharpMao 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de SharpMao
t00f 64 Messages postés lundi 21 avril 2008Date d'inscription 23 octobre 2009 Dernière intervention - 14 mai 2008 à 12:24
0
Merci
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
Commenter la réponse de t00f
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 14 mai 2008 à 13:34
0
Merci
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)
Commenter la réponse de SharpMao
t00f 64 Messages postés lundi 21 avril 2008Date d'inscription 23 octobre 2009 Dernière intervention - 14 mai 2008 à 13:53
0
Merci
Aie... Je continue mes recherches, et si j'ai des nouvelles, je viendrais poster ici ;)
Commenter la réponse de t00f
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 17 mai 2008 à 23:16
0
Merci
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
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.