2014-05-20 25 views
0

例如我有這樣的構造:我如何獲得構造函數或變量值中的所有變量的列表?

countDown = 0; 
      Client.CachePolicy = policy; 
      SatelliteClient.CachePolicy = policy; 
      btn8 = new Button(); 
      btn8 = button8; 
      timer11 = new System.Windows.Forms.Timer(); 
      timer11.Interval = 1000; 
      timer11.Enabled = false; 
      timer11.Tick += new EventHandler(timer11_Tick); 
      automaticDoubleClick = false; 
      this.MouseWheel += new MouseEventHandler(Form1_MouseWheel); 
      label18.Visible = false; 
      filesSizeButtonSwitch = false; 
      filesSizeDemoMode = false; 
      paintDemoButtonSwitch = false; 
      paintDemoMode = false; 
      debugButtonSwitch = false; 
      debugMode = false; 
      timerdelay = 0; 

這就是什麼,我都在構造函數中很小的一部分。 我也有一個記錄我沒有和我使用這樣的記錄:

Logger.Write("test"); 

我想要什麼,而不是鍵入Logger.Write每個變量vlaue做一些循環,它會遍歷自動獲取值的所有變量並將它們自動寫入記錄器。 舉例:

Logger.Write(variables[i].ToString()); 

就是這樣。

有沒有辦法做到這一點?我正在使用WinForms應用程序。

+0

直視反射 – Jonesopolis

+0

@ Jonesy反射對獲取局部變量根本沒有幫助,沒有什麼可以給你的局部變量的值短於調試器接口... –

回答

0

當前幀創建StackFrame對象,調用GetMethod得到MethodInfo對象當前方法,調用它的GetMethodBody方法得到MethodBody對象,然後使用LocalVariables屬性。我不知道所有的細節,因爲我從來沒有做過,但這是你應該開始尋找的地方。

更新:我進一步調查了一下,看起來我的建議沒有幫助,因爲LocalVariables集合中的LocalVariableInfo對象包含有關局部變量的數據,但沒有包含它們的值的數據或獲取其值的方法。

+0

這看起來更像是工作比簡單將代碼重構成更簡潔/更少的責任。你的建議也讓我有點害怕。 –

+0

@SimonWhitehead,它是被問到的問題的答案。是否應該問這個問題是一個不同的問題。無論如何,即使代碼編寫得好,也不意味着不需要跟蹤。我的建議可以用一種方法封裝起來,然後可以從任何地方調用,所以它根本不是那麼重要。如果你知道你在做什麼,這將需要幾分鐘的時間。 – jmcilhinney

+0

對不起,事實證明我的建議不起作用。 – jmcilhinney

0

一個簡單的想法是新的方法添加到您的類,在您指定的構造使用的每一個變量。這不是自動的,但工作原理:

private string GetVariables() 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("timer11 = " + this.timer11.Interval.ToString() + "\n"); 
     sb.Append("timer11 = " + this.timer11.Enabled.ToString() + "\n"); 
     sb.Append("automaticDoubleClick = " + this.automaticDoubleClick.ToString() + "\n"); 
     sb.Append("label18.Visible = " + this.label18.Visible); 
     // Add all needed variables -> 

     return sb.ToString(); 
    } 

再比如說,你可以在你的對象中使用Logger如下:

Logger.Write(this.GetVariables()); 

或外部:

Logger.Write(YourObject.GetVariables()); 
相關問題