t00f
Messages postés64Date d'inscriptionlundi 21 avril 2008StatutMembreDernière intervention23 octobre 2009
-
14 mai 2008 à 11:27
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDerniè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.
A voir également:
Le programme ne contient pas de méthode 'main' statique adaptée à un point d'entrée
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 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)
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 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)
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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
}