迭代当前方法的参数

时间:2012-07-16 00:11:39

标签: .net vb.net cil

嘿伙计我需要能够一般地遍历当前函数/ sub的所有参数(用于记录),例如:

Public sub SampleHandler(ByVal Sender as Object, ByVal e as EventArgs)
    Dim argholder as List(of Object)
    For each arg in getcurrentargs() '<-------- That thing
        argholder.add(arg)
    Next
    Log(argholder)
    'Continue doing method things
End Sub

有什么想法?我一直试图通过Emit(我没有完全掌握)和StackTrace来提取它们,但到目前为止无济于事。多个消息来源告诉我,MSIL能够做到这一点,但我所谈过的没有人可以给我一个有效的实现或明确解释如何。

其他信息:

我需要能够迭代函数的所有参数并将它们的值添加到列表中。这是通过提取名称然后可以利用它们来获取值的某种方法,或者只是某种可以引用它们的通用标识符,无论哪种方式都可以,但它必须是程序化的和静态代码块。 / p>

意图是在任何非敏感函数中(我正在为这个项目使用的代码有几百个),我希望能够放入对这个代码块的内联引用(想出了用于获取函数名称(完成),模块/类(已完成),运行(完成),结果(如果是函数;完成),当前err_level是什么(完成)以及什么的方法值作为参数传递(在我知道模块/类的逻辑上,函数名称,我可以根据需要匹配值),这样我就可以转向并记录它们。 “敏感”功能,我必须以不同的方式处理,以便我不会记录p / w和u / n或类似的东西;但那些都是照顾的。

2 个答案:

答案 0 :(得分:1)

一种可能性是更改Log()例程以使用paramarray ......

Sub Log(ParamArray o() As Object)
  For i As Integer = 0 To o.GetUpperBound(0)
    '...do stuff....
  Next
End Sub

然后在调用时添加每个参数...

Public sub SampleHandler(ByVal Sender as Object, ByVal e as EventArgs)
    Call Log(Sender, e)
    'Continue doing method things
End Sub

答案 1 :(得分:0)

您可以尝试System.Reflection.MethodBase.GetCurrentMethod,然后使用返回的方法GetParameters函数。

话虽如此,is some confusion/disagreement关于这是否真的有效,但如果没有其他原因可以尝试将其作为一种可能性消除,那么值得一试。