【问题标题】:Iterating through the parameters of the current method遍历当前方法的参数
【发布时间】:2012-07-14 20:29:52
【问题描述】:

大家好,我需要能够通用地遍历当前函数/子(用于日志记录)的所有参数,例如:

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 能够做到这一点,但与我交谈过的任何人都无法给我一个可行的实现或对如何做的明确解释。

附加信息:

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

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

【问题讨论】:

  • 您究竟是如何“插入对此代码块的内联引用”的?

标签: .net vb.net cil


【解决方案1】:

一种可能性是将您的 Log() 例程更改为使用参数数组...

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

【讨论】:

  • 如果我最终不得不手动执行此操作,那么我将使用此方法,因为它是我为它找到的最干净的实现。我会坚持认为有人有一个很好的答案。
【解决方案2】:

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

话虽如此,is some confusion/disagreement 关于这是否真的有效,但如果没有其他原因,除了消除它的可能性之外,它可能值得一试。

【讨论】:

  • 我喜欢这个思路,已经走过了那条小巷:GetParameters 返回每个参数的名称、类型和默认值,但遗憾的是,名称不能用作可引用的标识符,并且它没有值(几个小时的测试表明)。不过,该线程确实提出了拦截的想法,这可能会奏效......
猜你喜欢
  • 2011-05-23
  • 2017-12-07
  • 2021-03-28
  • 2013-07-29
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2018-02-21
  • 2016-01-09
相关资源
最近更新 更多