2009-12-07 83 views
2

是否可以获取参数名称(我在下面有parmName)? 或者也许在MSIL代码中只有相对位置,没有绝对parm名称?.NET所有方法参数的反射

我有一个在Microsoft Host Integration Server中使用HIP的不寻常的情况。当字段为NULL并且错误返回到CICS(在大型机上)时,错误是“A CALL TO VERIFYINVOKEPARAMS FAILED”。我对一个解决方案进行了硬编码,但试图制定一个适用于任何HIP子例程的通用解决方案。

感谢,

尼尔·沃尔特斯

// 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); 

      } 
     } 
    } 

额外的信息: 我打电话出版作为一个WCF Web服务一个BizTalk乐团。当它出现错误时,有些字段不会返回到上述程序。这就是数值如何成为NULL的原因。但是调用我的HIS/HIP程序的CICS /应用程序并不像空值。

+2

对不起扶手椅的建筑师,但我看到你在那里做什么,我不确定它落在最佳实践的领域......但我可能是错的。它可能更好,只是做!= null检查并抛出ArgumentNullExceptions,然后在异常处理程序中处理日志记录。至少,这是我见过的标准。 *耸耸肩* – 2009-12-07 19:52:39

+0

在这种情况下,可能会更好地忽略空值。抛出异常会有什么好处呢?他将不得不改变可能会很多的调用代码。 – ChaosPandion 2009-12-07 19:57:57

+0

由于HIS/HIP的性质,我有26个参数,每个都通过ref传递,代表COBOL结构。这是很多if语句,我们将不得不在未来的HIP计划中再次这样做。 HIP将.NET字段翻译为相应的COBOL格式(PIC S9(4)COMP等)。 – NealWalters 2009-12-07 20:23:26

回答

3

试试这个:

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

伟大的工程 - 我想下标将做到这一点:MethodBase.GetCurrentMethod()。GetParameters()[0] .Name – NealWalters 2009-12-08 14:16:13

+0

获取该值是下一个技巧 - 我会发布一个新的问题。 – NealWalters 2009-12-08 14:28:06

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

但我有26(或更多的可能性)。 – NealWalters 2009-12-07 20:32:11

+0

参考资料正在通过,我在编辑它们之前,他们出去,而不是当他们进来。 – NealWalters 2009-12-07 20:33:14

1

我觉得这行不这样做你以为它会做什么。


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

GetValue不会获取传递给该方法的参数的值。 GetValue(i)是Array类中的一个方法,它将简单地将第i个索引的值返回到ParameterInfo数组中。 ParameterInfo类没有关于该方法被调用的值的任何信息。我怀疑它会永远返回null。

+0

是的 - 这也是我所看到的。似乎应该有某种方式来达到价值,虽然...我很惊讶,索引不是“GetParameter [i] .getValue()”的其他方式。 – NealWalters 2009-12-07 20:36:43

+0

@NealWalters你看过面向方面吗?我在C#中创建了一个原型,使用ContextBoundObject在运行时检查方法调用的值。我不知道任何其他方式。 – 2009-12-07 20:58:55

+0

确切地说,我打赌他正在寻找类似于JavaScript参数数组的东西。 – ChaosPandion 2009-12-07 21:57:34

相关问题