2015-09-17 38 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