2015-09-17 87 views
0

有没有什么方法可以获取在方法和参数中声明的所有变量?如何获取在方法范围内声明的所有变量

我想在我想添加到日志的方法中获取所有变量及其值。 我可以使用MethodBase.GetCurrentMethod().GetParameters()获得方法定义中收到的参数。 这也有一个缺点,我注意到,我必须明确地传递一些特定的方法来获取参数的值。我想要的是,我希望所有变量及其值以一般方式在方法范围中声明,而不明确给出任何特定于方法的参数(因为我想将相同的逻辑添加到几个方法中)。 任何人都有你的想法。

在此先感谢。

+1

正如一个侧面说明,我不会建议这样做的日志记录。记录数百万不需要的东西,实际上会在尝试找到有用的东西时导致问题。 例如,想象一下你的方法中有'var index = 0',然后是'while'循环,以及这会如何将大量无用的信息添加到日志中。 – Charmander

+2

如果您查看为某个方法生成的IL,您将看到局部变量的名称并不总是被保留下来。 –

+0

“为几种方法添加相同的逻辑”?你能提供一个你想要实现的示例代码吗? – VJPPaz

回答

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的一种形式。

+0

感谢您的回复。 我要求任何类似于MethodBase.GetCurrentMethod()的C#方法GetParameters() – NCA

+0

@NCA,所以ycsun的答案表明,没有这样的方法:-) – Grundy

+0

@NCA,如果你想进入一个方法体内,反思对你无能为力。我不认为这是一个好主意,但如果你真的想去那里,不管是什么,也许你想看看[非托管API](https://msdn.microsoft.com/ EN-US /库/ vstudio/ch59zxfc%28V = vs.110%29.aspx)? – ycsun