[英]How can I know which method call my method?
我有3個方法A(),B()和C(),A()和B()都調用C()。 在方法C()中,如何從A()或B()調用它?
你不應該這樣做。 某些方法應該執行特定任務,該任務受其參數和對象屬性的影響,而不是調用者。
我不推薦這種方法 - 其他海報指出了處理這種方法的更好方法。 但如果你真的需要知道誰給你打電話,而不改變C()
的參數,你可以這樣做:
static void A()
{
C();
}
static void C()
{
StackTrace st = new StackTrace();
Console.WriteLine(st.GetFrame(1).GetMethod().Name); // prints "A"
}
請注意,生成StackTrace有點昂貴。 但是,這並不是什么大問題,除非你在代碼中這么做,而且你經常打電話。
同樣,你幾乎肯定會找到一種更好的方式來做你想做的事情。
方法C() 不需要知道調用它的方法。 如果這是您處理流邏輯的方式,則需要再次考慮如何編寫代碼。 如果我們假設有一些有效的理由需要知道哪個方法叫做C(),我會創建兩個'包裝器'方法:C_From_A()和C_From_B()。 任何特定於調用方法的邏輯都應該移動到新方法,而公共代碼保留在C()方法中並從兩個新方法調用:
public void C()
{
// Common Code goes here
}
public void C_From_A()
{
// Code only to be called from A() goes here.
C(); // Common code executed
}
public void C_From_B()
{
// Code only to be called from B() goes here.
C(); // Common code executed
}
public void A()
{
// Other code goes here
C_From_A();
}
如果您需要了解調試,只需使用調試器來逐步執行代碼。
您應該查看System.Diagnostics.StackFrame
類。 這里有一個例子: http : //www.csharp-examples.net/reflection-callstack/
簡單(干凈)的方法是向C
引入一個新參數,讓A
和B
告訴C
誰調用它。
只需在C()中設置斷點
我原則上同意你在大多數情況下都不需要知道。
然而,這可能有用的一個用例是在調試某些信息來自哪里時,如果傳遞了錯誤的參數。
但是在這種情況下,最好拋出異常,記錄異常並從中“恢復”。 顯然,這取決於調用方法的頻率,因為創建異常總會有一些開銷。 如果你出於某種其他原因需要這樣做,我建議你先看看你的設計。
如果你需要回調,我建議你讓A和B都實現一個接口並傳遞A或B作為參數。 接口可以有一個叫做回調的方法,C可以調用A或B.
在你試圖找出“錯誤參數被傳遞”的位置的情況下,你只需要在該方法中設置一個條件斷點,或者讓VS中斷拋出的異常,然后你可以檢查調用堆棧( Debug Menu,Window,Call Stack)查看整個調用者鏈(帶參數傳遞)給這個方法。
MethodBase callerMethod = new System.Diagnostics.StackFrame(1).GetMethod();
如果您正在編寫審計/日志框架,這很有用,但實際上,YDNTN適用於此處。 而且它在運行時耗費了大量資金。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.