【问题标题】:How to get all variables declared in a method scope如何获取在方法范围内声明的所有变量
【发布时间】:2015-12-14 00:50:44
【问题描述】:

有什么方法可以获取方法中声明的所有变量和接收到的参数?

我正在尝试以我想要添加到日志的方法中获取所有变量及其值。 我可以使用MethodBase.GetCurrentMethod().GetParameters() 获取方法定义中接收到的参数。 这也有一个缺点,我注意到,我必须明确地传递特定于方法的东西才能获取参数的值。

我想要的是,我想要以一般方式在方法范围中声明的所有变量及其值,而不显式地给出任何方法特定的参数(因为我想为多个方法添加相同的逻辑)。 任何人都请有你的想法。

提前致谢。

【问题讨论】:

  • 顺便说一句,我不建议在日志记录中这样做。在试图找到有用的东西时,记录数百万你不需要的东西实际上会导致问题。例如,假设您有var index = 0,然后在您的方法中有一个while 循环,这将如何在您的日志中添加大量无用信息。
  • 如果查看为方法生成的 IL,您会发现局部变量的名称并不总是保留。
  • “将相同的逻辑添加到多个方法中”?你能提供一个你想要实现的示例代码吗?

标签: c# variables methods reflection parameters


【解决方案1】:

你想要达到的目标是不可能的。首先,如果要记录所有变量在方法中接收的值,请考虑以下代码:

void SomeMethod()
{
  int n = 0;
  for (;;)
    n++;
}

你必须创建一个无限长的日志,这是不可能的。

其次,如果您只想知道变量的初始而不给参数赋值,请考虑以下几点:

void SomeMethod(int m)
{
  int n = m == 0 ? 1 : 2;
  ...
}

不知道m 的值,你根本无法知道n 的值。

第三,即使你有所有的参数值,你只想知道一个变量的初始值,这仍然是不可能的,以一般的方式。事实上,你甚至不知道变量是否会被声明。考虑以下几点:

void SomeMethod(...some parameters...)
{
  ...some complex code...
      int n = 0;  // deep inside some complex control statements
  ...more complex code...
}

一般而言,您无法知道int n = 0; 是否会被执行,因此您无法知道变量n 是否会被声明。这是the halting problem 的一种形式。

【讨论】:

  • 感谢您的回复。我要求任何类似于 MethodBase.GetCurrentMethod().GetParameters() 的 c# 方法
  • @NCA,所以 ycsun 的回答表明没有这样的方法 :-)
  • @NCA,如果你想进入方法的主体,反射对你没有多大帮助。我不认为这是一个好主意,但如果你真的想去那里,无论如何,也许你想看看unmanaged APIs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2020-02-03
  • 2016-09-18
相关资源
最近更新 更多