2013-07-09 122 views
2

有沒有辦法讓C#方法即所有來電者:如何獲取調用方法名稱?

public string Caller(string str) 
{  
    Customer cust = new Customer(); 
    cust.Firstname = "Peter"; 
    cust.LastName = "Beamer"; 
    string t = getName(cust); 
    return t; 
} 

private string getName(Customer customer) 
{ 
    return customer.Firstname +" "+ customer.LastName; 
} 

將返回:來電。

我現在可以得到的所有方法正文文本使用EnvDTE.CodeFunction。也許有更好的方法來實現它,而不是試圖解析這些代碼。

注意:我不想獲取當前方法的調用方法名稱。我想如果我給方法的名稱,那麼它將返回傳遞方法的調用方法名稱。

+6

*什麼*會返回'來電者?目前尚不清楚你的背景是什麼。 –

+2

可能的重複[如何找到調用當前方法的方法?](http://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-c​​alled-the-current -method) – Gray

+0

@Gray:我不想獲取當前方法的調用方法名稱。我想如果我給方法名稱比我的代碼應該返回通過方法的調用者。在我給出的例子中,如果我給'getName'作爲方法名,那麼我的代碼應該返回'Caller'。 – ChandniShah

回答

6
new StackFrame(1, true).GetMethod().Name 

注意,在發佈版本的編譯器可能會內聯該方法被調用,在這種情況下,上面的代碼將返回調用程序的調用程序,因此爲了安全起見你應該裝點你的方法:

[MethodImpl(MethodImplOptions.NoInlining)] 

來源:https://stackoverflow.com/a/1310148/1714342

+4

只要注意性能影響。不要在生產代碼中使用它。如果你認爲你真的需要它,看看PostSharp –

+0

@SteveB,我會說完全一樣的東西! –

+0

@wudzik:這將返回當前方法的調用者名稱。我想如果我給方法名稱比我的代碼應該返回通過方法的調用者。 – ChandniShah

3

雖然它肯定是可以做到使用StackFrame它作爲wudzik指出,爲什麼你要這麼做?

這是一種設計的氣味。如果您的代碼必須知道其調用者的知識,那麼您的設計有些問題。每個這樣的依賴都應該從你的類模型中抽象出來。

+0

我認爲它可能對調試有幫助,但我同意它非常類似於生產代碼不應該使用或依賴的東西。 – Gray

+1

如果您在代碼中放置斷點,您可以隨時檢查整個堆棧跟蹤。將代碼中的這種依賴關係放在代碼中是不必要的,即使是爲了調試的目的......代碼很快就會變得難以理解和不可維護(很難改變!) –

+0

這很有道理;無論如何,我不認爲它長期屬於代碼。它絕對看起來像你會用一種不包含Visual Studio附帶的強大調試器的語言來做的事情。它只是有一種臨時的'Debug.WriteLine'的感覺,你可以更好地理解流程。對於不熟悉調試器的人來說,更多的教育/新手工具。分析/優化可能有一些真正合法的用途,但我不能拿出一個很好的例子。 – Gray

4

並不真正我明白你在問什麼,因爲沒有人確定應該返回什麼「調用者」......但是,也許CallerMemberNameAttribute可能有一些幫助?