Pouvez-vous utiliser la réflexion pour trouver le nom de la méthode d'exécution actuelle?
Comme le dit le titre: réflexion Peut vous donner le nom de la méthode d'exécution.
Je suis enclin à ne le pense pas, parce que de la de Heisenberg problème. Comment appelez-vous une méthode qui vous indiquera la méthode actuelle sans changer ce que la méthode actuelle est? Mais j'espère que quelqu'un peut me démontrer que je me trompe là-bas.
Mise à jour:
- Partie 2: Pourrait-il être utilisé pour regarder à l'intérieur du code de la propriété du bien?
- Partie 3: Quel serait le rendement comme?
Résultat Final
J'ai appris à propos de MethodBase.GetCurrentMethod(). J'ai aussi appris que non seulement puis-je créer une trace de la pile, je peut créer uniquement à l'image exacte j'ai besoin si je veux.
À utiliser ceci à l'intérieur d'une propriété, il suffit de prendre un .Substring(4) pour enlever le set_ " ou "get_'.
- Joel, je sais que c'est une vieille question, mais que voulez-vous dire par la création d'une image précise d'une méthode?
- Il se réfère à un élément spécifique dans la pile d'appel: la partie de la trace de la pile qui compte.
Vous devez vous connecter pour publier un commentaire.
Comme de .NET 4.5, vous pouvez également utiliser [CallerMemberName]
Exemple: une propriété setter (pour répondre à la partie 2):
Le compilateur offre répondant à des littéraux de chaîne à callsites, donc il n'y a fondamentalement pas de surcharge de performance.
StackFrame(1)
méthode décrite dans d'autres réponses pour l'exploitation forestière, qui semblait fonctionner jusqu'à ce que la Gigue a décidé de commencer l'in-lining choses. Je n'ai pas envie d'ajouter l'attribut de prévenir inline pour des raisons de performances. À l'aide de la[CallerMemberName]
approche de la correction du problème. Merci!OnPropertyChanged("SomeProperty")
et pasOnPropertyChanged("SetProperty")
http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getcurrentmethod.aspx
L'extrait fourni par la Lex était un peu long, donc je suis en soulignant le rôle important puisque personne d'autre a utilisé exactement la même technique:
Cela devrait renvoyer des résultats identiques à la MethodBase.GetCurrentMethod().Nom technique, mais il vaut la peine de souligner, car j'ai pu mettre en œuvre cette fois dans son propre méthode à l'aide de l'index 1 pour la précédente méthode et l'appeler à partir d'un certain nombre de propriétés différentes. Aussi, il ne renvoie une image plutôt que de l'ensemble de la trace de la pile:
C'est un one-liner, trop 😉
string MethodName = new StackTrace(new StackFrame(0)).GetFrame(0).GetMethod().Name;
Essayez ceci à l'intérieur de la méthode main d'une console vide programme:
Sortie De La Console:
Main
Oui certainement.
Si vous voulez un objet à manipuler j'utilise une fonction comme ceci:
Cette ligne:
Promenades en place la trame de pile à trouver la méthode d'appel puis nous avons utiliser la réflexion pour obtenir des informations sur le paramètre des valeurs transmises pour le générique de la fonction de rapport d'erreurs. Pour obtenir la méthode actuelle tout simplement utiliser de pile actuel cadre (1) à la place.
Comme d'autres l'ont dit pour les méthodes actuelles de nom, vous pouvez également utiliser:
Je préfère la marche de la pile car si regarder intérieurement à cette méthode, il crée simplement un StackCrawlMark de toute façon. L'adressage de la Pile directement semble plus clair pour moi
Post 4.5 vous pouvez maintenant utiliser la [CallerMemberNameAttribute] dans le cadre de la méthode des paramètres pour obtenir une chaîne de caractères du nom de la méthode, qui peut aider dans certains scénarios (mais vraiment dans l'exemple ci-dessus)
Il semble que ce soit surtout une solution pour INotifyPropertyChanged soutien là où auparavant vous aviez des chaînes éparpillées à travers votre code d'événement.
La comparaison des moyens pour obtenir le nom de la méthode -- à l'aide d'un arbitraire calendrier de construire dans LinqPad:
CODE
RÉSULTATS
réflexion
la réflexion
stacktrace
stacktrace
inlineconstant
inlineconstant
constante
constante
expr
e => e.expr()
exprmember
exprmember
callermember
Principal
Noter que le
expr
etcallermember
méthodes ne sont pas assez "droit". Et là, vous voyez une répétition de un commentaire que la réflexion est ~15x plus rapide que la stacktrace.EDIT: MethodBase est probablement une meilleure solution pour obtenir juste la méthode que vous êtes (par opposition à l'ensemble de la pile d'appel). Je serais toujours préoccupé par l'in-lining cependant.
Vous pouvez utiliser une StackTrace à l'intérieur de la méthode:
Et le regard sur les images:
Toutefois, sachez que si la méthode est inline, vous ne serez pas à l'intérieur de la méthode que vous pensez de vous. Vous pouvez utiliser un attribut pour empêcher l'in-lining:
new StackTrace(true)
au lieu denew StackTrace(false)
. En le définissant àtrue
sera la cause de la trace de la pile à atttempt capturer le nom du fichier, le numéro de ligne et etc, qui peut faire appel plus lent. Sinon, une belle réponseLa manière la plus simple de traiter est:
Si le Système.La réflexion est inclus dans l'utilisation de bloc:
Comment à ce sujet ceci:
Je pense que vous devriez être en mesure d'obtenir la création d'un StackTrace. Ou, comme @edg et @Lars Mæhlum mentionner, MethodBase.GetCurrentMethod()
Si vous avez besoin simplement le nom de la chaîne de la méthode, vous pouvez utiliser des Expressions. Voir http://joelabrahamsson.com/entry/getting-property-and-method-names-using-static-reflection-in-c-sharp
Essayez ceci...
Je viens de le faire avec une simple classe statique:
puis dans votre code: