Obtenir le nom de la méthode

kiboumz Messages postés 120 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 18 mai 2007 - 12 avril 2007 à 22:44
kiboumz Messages postés 120 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 18 mai 2007 - 13 avril 2007 à 19:28
Bonjour,


J'aimerais pouvoir accèder à certaines caractéristiques d'une méthode.


J'ai commencé à regarder du côté de system.reflection.methodbase.GetCurrentMethod()


Cela me donne beaucoup d'info, mais j'ai de la difficultés à filter l'information.


1. Je voudrais le nom de la méthode : MethodBase.Name

2. Je voudrais la porté d'une méthode (public / private) : Je sais pas comment ...

3. Je voudrais le type méthode ou fonction : Je sais pas comment ...

4. Je voudrais le nom des paramètres : MethodBase.GetParameters(index).Name

5. Je voudrais la valeur des paramètres : Je sais pas comment ...

6. Je voudrais savoir si les paramètres sont ByVal ou ByRef : Je sais pas comment ...


En fait en premier je voudrais reconstituer le nom de la méthode / fonction et ensuite obtenir les valeurs des paramètres ...


Merci

a+

6 réponses

Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
12 avril 2007 à 23:58
Salut,
Alors pour la portée d'un méthode, tu as
MethodBase.Attributes ou bien encore plus simple MethodBase.IsPublic, IsPrivate....

Pour le type, on peut utiliser une astuce. MethodBase ne contient pas cette information, mais bien MethodInfo. Il s'agit d'utiliser les informations de MethodBase pour retrouver le MethodInfo par le type de la classe déclarant MethodBase :

        Dim mb As System.Reflection.MethodBase = System.Reflection.MethodBase.GetCurrentMethod()
        Dim mbArgTypes(mb.GetParameters.Length - 1) As System.Type
        For i As Integer = 0 To mb.GetParameters.Length - 1
            mbArgTypes(i) = mb.GetParameters(i).ParameterType
        Next
        MsgBox("Type de renvoi : " & mb.DeclaringType.GetMethod(mb.Name, mbArgTypes).ReturnType.ToString)

Simplement, je recherche une méthode ayant le même nom et la même signature que la MethodBase en cours.

Pour ce qui est des paramètres, je ne comprends pas bien ce que tu veux dire. Les objets MethodBase et MethodInfo donne des informations sur les méthodes en général, sur leur code, mais pas sur "l'instance de la méthode en cours d'exécution" si je puis dire...
Au mieux, tu peux avoir les valeurs par défault des paramètres (mb.GetParameters(i).DefaultValue), mais pour leurs valeurs en cours, il faudra trouver autre chose...

Pour le (byref/byval) des paramètres, je trouve pas, mais j'en suis étonné... Pourtant on doit chauffer, ca doit pas être bien loin...

<hr size="2" width="100%" />Julien.
0
kiboumz Messages postés 120 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 18 mai 2007
13 avril 2007 à 15:47
Salut,

En fait, pour les paramètres, je voulais avoir leurs valeurs pour la raison suivante :

La raison pourquoi je veux reconstituer la fonction est que dans un try catch quand j'obtiens une erreur j'appel une fonction EcrireErreur.

Je passe à cette fonction : System.Reflection.MethodBase.GetCurrentMethod()

Ensuite, je voudrais écrire dans un fichier le plus d'information relative à l'erreur. En autre, le nom de la méthode qui a crée l'erreur et la valeur de ces paramètres ...

Je ne voulais pas avoir à passer par exemple EcrireErreur(NomMethode, tValeursParametres) ... Je trouve cela plus générique si je ne peux que passer une seule valeur ...

Si vous avez des suggestions, n'hésitez pas!

Merci
a+
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
13 avril 2007 à 17:44
Mais, le System.Reflection.MethodBase.GetCurrentMethod(), tu le passe en paramètre de EcrireErreur alors ?
Sinon tu obtines la Méthode EcrireErreur et non la méthode en cours pendant l'erreur...
Je réfléchis pour les paramètres, mais je pense de moins en moins que ce soit possible, les paramètres sont traités comme des simples variables locales popées de la pile en entrant dans la méthode, je sais pas si y'a un moyen de les distinguer et des les récup comme ca...

<hr width="100%" size="2" />Julien.
0
kiboumz Messages postés 120 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 18 mai 2007
13 avril 2007 à 17:52
Salut,

Effectivement, je passse le System.Reflection.MethodBase.GetCurrentMethod() à EcrireErreur.

Pour les paramètres, peut-être qu'avec le Reflection on peut pas, mais il y a peut-être un autre moyen ...

Merci
a+
0

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

Posez votre question
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
13 avril 2007 à 18:47
Ha j'ai trouvé pour le byval/byref,
Lorsque tu demande

Dim mb
As System.Reflection.MethodInfomb = System.Reflection.MethodBase.GetCurrentMethod.DeclaringType.GetMethod(System.Reflection.MethodBase.GetCurrentMethod.Name)

Dim paramlist
As System.Reflection.ParameterInfo()paramlist = mb.GetParameters

MsgBox(paramlist(0).ParameterType.ToString
)

Selon que le paramètre soit byref ou byval il y a l'opérateur & derrière le type écrit comme l'opérateur de pointeur en C finalement...
Donc pour ByRef param as Integer -> System.Int32&
ByVal param as Integer -> System.Int32

<hr width="100%" size="2" />Julien.
0
kiboumz Messages postés 120 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 18 mai 2007
13 avril 2007 à 19:28
Salut,

Si je résume j'ai ceci comme code :

            lcError &= IIf(poMethodBase.IsPrivate, "Private ", "Public ")

            lcError &= poMethodBase.Name & " ("
            'Dim mbArgTypes(poMethodBase.GetParameters.Length - 1) As System.Type
            'For i As Integer = 0 To poMethodBase.GetParameters.Length - 1
            '    mbArgTypes(i) = poMethodBase.GetParameters(i).ParameterType
            'Next
            'lcError &= poMethodBase.DeclaringType.GetMethod(poMethodBase.Name, mbArgTypes).ReturnType.ToString

            For liParameters As Integer = 1 To poMethodBase.GetParameters().Length
                If liParameters > 1 Then
                    lcError &= ", "
                End If                lcError &IIf(Right(poMethodBase.GetParameters(liParameters - 1).ParameterType().ToString(), 1) "&", "ByRef ", "ByVal ")
                lcError &= poMethodBase.GetParameters(liParameters - 1).Name & " As "
                lcError &= poMethodBase.GetParameters(liParameters - 1).ParameterType.ToString()                lcError IIf(Right(poMethodBase.GetParameters(liParameters - 1).ParameterType().ToString(), 1) "&", lcError.Substring(0, lcError.Length - 1), lcError.Substring(0, lcError.Length))
            Next
            lcError &= ")"
            lcError &= Environment.NewLine()

Le code en commentaire est celui supposé me dire si c'est une fonction ou un sub, mais cela ne fonctionne pas.

Pour l'instant si j'ai une fonction par exemple qui appel ma méthode : private sub Main(byval test1 as string, byref test2 as integer)

Je la reconstruit comme suit : Private Main (ByVal test1 As System.String, ByRef test2 As System.Int32)

Donc, il me manque le type (fonction ou méthode) et si possible, faudrait trouvé une manière de pouvoir avoir les valeurs des paramètres ...

Merci!
a+
0
Rejoignez-nous