簡體   English   中英

我怎么知道哪種方法調用我的方法?

[英]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引入一個新參數,讓AB告訴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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM