10
votes

Comment énumérer les paramètres de la méthode passés

On peut énumérer les types de paramètres de la méthode appelés tels que ceci: xxx

mais y a-t-il un moyen d'obtenir l'objet réel de chaque paramètre?

Modifier : Mon objectif est d'énumérer tous les paramètres et d'obtenir leurs valeurs. Utilisation des expressions LINQ, on peut obtenir la valeur de paramètre comme: xxx

mais ce que je voudrais faire est quelque chose comme: xxx

et ont ainsi une méthode générique pour la collecte de tous les paramètres et de leurs valeurs.


6 commentaires

Essayez-vous de créer une trace de pile contenant les valeurs de paramètre réelles?


UHM, les instances de paramètres réelles sont là dans la méthode ...


@Mark: Ma pensée aussi, mais voyant qu'il est évident qu'il cherche quelque chose de plus général, quelque chose qui vous permettrait d'obtenir les valeurs de tout cadre de cheminée (je devine ...)


@John, je peux obtenir les valeurs en fonction des informations supplémentaires que j'ai ajoutées. Ce que je veux, c'est d'énumérer les objets de paramètre et d'obtenir leurs valeurs de manière générique.


@John ("deviner"), oui, ça sonne comme ce que je veux.


Je vais m'en tenir à ma réponse orginale, j'ai pensé aux arbres d'expression pendant un moment, puisque vous êtes prêt à écrire des trucs supplémentaires vous-même, mais je ne peux tout simplement pas voir comment. Vous ne pouvez pas créer de fermeture de manière dynamique (quelque chose qui fait référence à la portée) qui vous donne ensuite les valeurs de paramètre. J'ai fait des punitions plus tôt et j'ai trouvé un projet intéressant appelé postsharp.org , vous pourriez vouloir reconsidérer la façon dont vous allez à propos de quelque chose comme ça et voyez si vous ne pouvez pas y accomplir de manière orientée vers une aspect.


3 Réponses :


1
votes

D'accord, voici la transaction.

Vous ne pouvez pas faire cela, pas d'une langue gérée. Je ne vois pas comment quelqu'un vous permettrait de prendre le contrôle du cadre de pile. Et d'une manière c'est ce que vous voulez. Parce que vous avez besoin des informations pour obtenir les valeurs.

Maintenant, le temps d'exécution le sait, il dispose de toutes les informations, mais vous ne pouvez pas faire des hypothèses sur la manière dont cela va créer un cadre de pile, parce que vous ne sont pas destinés à faire cela.

Ergo, il n'y a qu'un seul moyen d'y aller. L'API de profilage.

Je finis par ici . Dans les fonctions de l'API du profilage. Je parie qu'il y a un moyen de faire cela qui vous permet de creuser dans les valeurs de paramètre en invoquant une classe non gérée du code géré.

Maintenant, je ne ferais pas cela parce qu'il y a déjà de grands outils de profilage, Jetbrains DotTrace pour en nommer un et avec Intellitrace dans VS2010 Toutes ces maux de tête partiront tout simplement ... IntelliTrace vous permettra de faire du débogage de voyage.

L'autre et évidente de le faire est totalement foobar, mais pourrait se terminer amusant d'expérimenter, il peut toujours être fait de cette façon, mais je ne voudrais jamais mettre ce code dans un environnement de production. xxx

maintenant, vous ne pouvez pas écrire Pour baseaddr mais vous devez être autorisé à le lire. La partie délicate est de donner un sens aux cadres de pile et qui doit avec la convention appelante et que vous devez savoir pour certains peuplés. Voici un manquement à ce genre de choses et c'est FastCall.

Avec ces informations et les objets ParameterInfo, vous devriez être capable de marcher à travers les arguments.

Puisque vous travaillerez avec des pointeurs bruts, vous devez faire des objets gérés, et il y a un classe pour cela .

Voilez-vous, allez-y, allez des noix!

un gros avertissement si , ce que vous trouverez comme vous marchez la pile, ne serez pas ce que vous attendez. Parce que les arguments peuvent être placés dans des registres et des registres ne peuvent être accessibles à partir du code géré.


0 commentaires

1
votes

Vous pouvez utiliser MethodInfo.getCurrentMethod (). GetParameters () Pour obtenir une liste des paramètres de la méthode. Mais il est impossible d'obtenir leurs valeurs par réflexion.


1 commentaires

@Mehdi. Oui, la méthode GetParameters () était déjà couverte dans ma question, merci.



9
votes

Mise à jour:

ressemble à je "surcommandé" la réponse initiale en essayant de tout expliquer. Voici la version courte de la réponse. xxx

et voici la version longue avec certaines explications.

En fait, si vous utilisez des arbres d'expression, Vous n'avez pas besoin d'être à l'intérieur d'une méthode pour énumérer ses paramètres. xxx

note, que si vous utilisez des arbres d'expression, votre code dépend beaucoup sur une expression transmise à la méthode. J'ai montré une utilisation des constantes et une utilisation de variables. Mais bien sûr, il peut y avoir plus de scénarios. Vous pouvez refactoriser ce code pour utiliser une seule méthode pour les deux cas, mais j'ai décidé que cela illustre mieux le problème de cette façon.


4 commentaires

Merci d'avoir répondu. Cependant, je cherchais quelque chose qui pourrait être mis à l'intérieur de Somemethod () pour le rendre générique. L'exemple que vous avez fourni forces à appeler le code personnalisé avant SOMEMETHOD ().


Non, vous n'avez pas besoin d'appeler quoi que ce soit avant Somemethod. Prenez le code marqué comme «deuxième approche» (ignorez simplement la déclaration et l'initialisation des variables) et la coller à la méthode. Vous obtiendrez l'énumération des paramètres à l'intérieur de la méthode. Je voulais juste souligner que vous pouvez le faire de n'importe où, pas nécessairement du corps de la méthode.


Si vous devez expliquer d'une manière ou une fois d'une manière explicite, énumérez les paramètres du code source, pourquoi la peine d'avoir getparameters du tout? Cela fera: objet [] parames = nouvel objet [] {thevAlue, thatvalue};


@Alexandrarusina Je reçois ça est vieux. Cependant, avez-vous rencontré des situations dans lesquelles la mémorexpression.member est un PropertyInfo plutôt que fieldinfo ? Je fais quelque chose comme ça et propertyInfo s me causent un énorme mal de tête. Merci!