2009-12-07 7 views
2

Est-il possible d'obtenir le nom du paramètre (où j'ai parmName ci-dessous)? Ou peut-être dans le code MSIL il n'y a que des positions relatives, pas de noms de paramètres absolus?.NET Réflexion de tous les paramètres de la méthode

J'ai un cas inhabituel utilisant HIP dans Microsoft Host Integration Server. Lorsque les champs sont NULL et l'erreur retourne à CICS (sur le mainframe), l'erreur est "A CALL TO VERIFYINVOKEPARAMS FAILED". J'ai codé en dur une solution, mais essayait de faire une solution générale qui fonctionnerait pour n'importe quel sous-programme HIP.

Merci,

Neal Walters

// check for null values in any of the parameters 
    MethodBase method = MethodBase.GetCurrentMethod(); 
    //string key = method.Name + "("; 
    for (int i = 0; i < method.GetParameters().Length; i++) 
    { 
     if (method.GetParameters().GetValue(i).GetType() == typeof(String)) 
     { 
      if (method.GetParameters().GetValue(i) == null) 
      { 
       string parmName = " Parm #" + i; 
       msg = "Value of return variable " + parmName + " is null (should be blanks)"; 
       System.Diagnostics.EventLog.WriteEntry("LOGGER", msg, 
        System.Diagnostics.EventLogEntryType.Error); 

      } 
     } 
    } 

Extra info: J'appelle un Orch BizTalk publié en tant que service Web WCF. Quand il y a des erreurs, certains champs ne sont pas reliés en série au programme ci-dessus. C'est ainsi que les valeurs sont devenues NULL en premier lieu. Mais l'application CICS/qui appelle mon programme HIS/HIP n'aime pas les valeurs nulles.

+2

Désolé d'architecte fauteuil, mais je vois ce que vous essayez de faire là-bas, et je ne suis pas sûr que cela tombe sous le domaine des meilleures pratiques ... mais je peux me tromper. il est probablement préférable de faire juste! = null vérifie et lance ArgumentNullExceptions, puis gère la journalisation dans votre gestionnaire d'exceptions. Au moins, c'est la norme que j'ai vue. * shrug * –

+0

Dans ce cas, il peut être préférable d'ignorer les valeurs nulles. A quoi bon lancer l'exception? Il devrait changer le code d'appel qui pourrait être beaucoup. – ChaosPandion

+0

En raison de la nature de HIS/HIP, j'ai 26 paramètres, chacun passé par réf, représentant une structure COBOL. C'est beaucoup de déclarations if, et nous devrions le faire à nouveau dans un futur programme HIP. HIP a traduit les champs .NET aux formats COBOL correspondants (PIC S9 (4) COMP etc ...) – NealWalters

Répondre

3

Essayez ceci:

var parameters = MethodBase.GetCurrentMethod().GetParameters(); 
foreach (ParameterInfo parameter in parameters) 
{ 
    Console.WriteLine(parameter.Name); 
} 
+0

Fonctionne bien - Je suppose que la façon de le faire par indice serait la suivante: MethodBase.GetCurrentMethod(). GetParameters() [0] .Name – NealWalters

+0

Obtenir la valeur est la prochaine astuce - Je posterai dans une nouvelle question. – NealWalters

0
public struct Argument 
{ 
    public String Name; 
    public String Value; 
} 

public void Method(Argument[] arguments) 
{ 
    for (int i = 0; i < arguments.Length; i++) 
    { 
     var v = arguments[i].Value; 
     if (v == null) 
     { 
      var message = "Param " + arguments[i].Name + " cannot be null."; 
      EventLog.WriteEntry("LOGGER", message, EventLogEntryType.Error); 
     }   
    }  
} 
+0

Mais j'ai 26 (ou potentiellement plus de paramètres). – NealWalters

+0

Les paramètres sont passés par ref, et je les édite avant qu'ils ne sortent, pas quand ils entrent. – NealWalters

1

Je pense que cette ligne ne fait pas ce que vous pensez qu'il va faire.


if (method.GetParameters().GetValue(i) == null) 

GetValue n'obtiendra pas la valeur du paramètre transmis à la méthode. GetValue (i) est une méthode de la classe Array qui retournera simplement la valeur de l'index i'th dans le tableau, qui est un ParameterInfo. La classe ParameterInfo n'a aucune information sur la valeur avec laquelle la méthode a été appelée. Je doute qu'il reviendra jamais nul.

+0

Oui - c'est aussi ce que j'ai vu. On dirait qu'il devrait y avoir un moyen d'atteindre la valeur ... J'ai été surpris que l'index ne soit pas l'inverse "GetParameter [i] .getValue()". – NealWalters

+0

@NealWalters avez-vous étudié les aspects? J'ai fait un prototype en C#, en utilisant ContextBoundObject pour inspecter les valeurs d'un appel de méthode au moment de l'exécution. Je ne connais pas d'autre moyen. –

+0

Exactement je parie qu'il cherche quelque chose de similaire au tableau d'arguments JavaScript. – ChaosPandion

Questions connexes