2016-09-28 25 views
2

我的課程需要額外的信息才能正確輸出其狀態,所以我添加了一個自定義PrintSelf方法,並採用適當的參數。如何找出誰(隱式)調用我的ToString?

不過,恐怕還是有要求我的大型項目,該項目並沒有被新的方法來取代的ToString。我怎樣才能找到這些不正確的ToString調用?

我使用VS 2015年,但它似乎不具備這樣的能力。

中的ToString拋出異常將是一個明顯的方式,但我並不想這樣做的原因有兩個:

  1. 的ToString仍然可以執行不依賴於增加了一個不同的工作和輸出的東西參數。

  2. 沒有辦法得到充分的代碼覆蓋率,這意味着它只會發現隱含調用的少數情況,但不能(可靠)所有。

+3

日誌中調用堆棧?爲什麼不重寫ToString而不是PrintSelf? – Marcus

+0

「ToString」的概念是給出你的實例的文本表示。這絕不需要外部輸入,因爲外部輸入不是實例的一部分。 – juharr

+0

把一個斷點,並檢查調用堆棧, –

回答

4

要覆蓋的ToString和日誌,你可以像這樣

public override string ToString() 
    { 
     StackTrace stackTrace = new StackTrace();   
     StackFrame[] stackFrames = stackTrace.GetFrames(); 

     StackFrame callingFrame = stackFrames[1]; 
     MethodInfo method = callingFrame.GetMethod(); 
     YourLogingMethod(method.DeclaringType.Name + "." + method.Name); 

     return base.ToString(); 
    } 
+0

謝謝,這是一個好主意,並解決了我提到的兩個問題中的第一個問題(對於不需要更復雜輸出的調用者,ToString仍然可用)。 - 遺憾的是,它並沒有解決第二個問題(完整的代碼覆蓋率)。 – mafu

+0

我不知道你是什麼意思,得到他們所有的人?這個方法會給你將每個調用者記錄到ToString方法的可能性嗎?你有控制所有的源代碼調用這個tostring方法嗎? (在這種情況下,你可以使用查找使用搜索的overidden方法解決方案 – Thorarins

+0

內找到他們我的意思是,這需要所有(的IM或顯式)調用的toString到執行過程中實際調用。我不能保證,因爲代碼庫太大,無法檢查每一行可能的調用 – mafu

1

呼叫者可以使Obsolete Attribute的用法:

public class MyFirstClass 
{ 
    //true or false parameters indicates whether to throw 
    // a compile error (true) or warning (false) 
    [Obsolete("Please use the method PrintSelf() instead of ToString()", false)] 
    public overrides string ToString() 
    { 
     //Whatever code you want here 
     return ""; 
    } 
} 

public class MySecondClass 
{ 
    public void Test() 
    { 
     mfc = new MyFirstClass(); 
     mfc.ToString(); //Here you will get a compiler warning 
    } 
} 

因此,這將讓你知道在Visual Studio中所有對此功能的調用。由於這只是一個警告,所以仍然可以使用它。

(注:很抱歉,如果語法不正確,我通常是VB.NET中developper如果需要的話,隨時糾正它。)

+0

我認爲這不會有幫助,調用'String .Format(「{0}」,myFirstClass);'會使用'.ToString()',但不會拋出編譯器警告/錯誤。 –

+0

我認爲斯科特是正確的,但是這是一個好主意,無論它提供顯式調用的自動靜態分析,並且至少應該防止(顯式)調用ToString的意外進一步增加。 – mafu

+0

@ScottChamberlain正確,但至少(如@mafu所述)用戶將被警告不要使用它... –