2009-08-07 64 views
3

我想在.NET中使用反射來訪問調用我的方法的對象。我認爲這是可能的查看堆棧跟蹤。我知道這是不安全的,因爲各種原因,但我只需要抓取並編制一些屬性值。使用C#反射訪問堆棧跟蹤對象

我該怎麼做?

更新:我是個白癡,我忘了說,這是在C#

+1

http://stackoverflow.com/a/10530629/8155 – 2013-02-08 13:54:17

回答

2

如果一個靜態方法調用你呢?

如果他們把自己傳遞給你,那麼與呼叫者的合同會不會更好(更簡單)?

+0

當然,但我沒有控制調用庫。我正在研究編寫命令歷史Launchy插件,他們的插件模型在某種程度上缺乏靈活性。我知道誰會打這個電話,我只需要一些方法來訪問它 – 2009-08-07 03:44:10

2

您可以使用堆棧跟蹤&的StackFrame類

這裏有一個例子來自MSDN

http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe.aspx

這是一個例子,它應打印 「主」

class Program 
{ 
    static void Main(string[] args){ 
     Func(); 
    } 
    static void Func(){ 
     StackFrame frame = new StackFrame(1); 
     StackTrace trace = new StackTrace(frame); 
     var method = frame.GetMethod(); 
     Console.WriteLine(method.Name); 
    } 
} 
+0

了不起的信息,不知道。但我真的需要關於調用我的方法的實例的信息。 – 2009-08-07 04:43:29

+0

您需要使用StackFrame對象構造函數,並將它傳遞給調用堆棧中的多個級別的整數。例如新的StackFrame(1)意味着調用者StackFrame(2)調用者的來電者 – bashmohandes 2009-08-07 05:43:45

5
var methodInfo = new StackFrame(1).GetMethod(); 

返回調用的方法編輯當前的方法。

請注意,編譯器可能會內聯或以其他方式優化對方法的調用(儘管聽起來像您可能不是這種情況),這會阻礙預期的行爲。爲了安全起見,與裝飾你的方法:

[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] 

注意的是:這有悖於讓編譯器完成其工作。買者自負。

EDITED糟糕,我看到你想調用你的方法的實例。沒有辦法獲得這些信息。

+0

感謝您的迴應。理論上VS調試器可以訪問的所有信息是否也適用於我?調試器可以在調用方法的實例中查找堆棧幀...... – 2009-08-07 03:57:14

+0

您可能必須作爲調試器附加到進程才能獲得此級別的詳細信息。請參閱http://stackoverflow.com/questions/420541/is-there-any-way-to-get-a-reference-to-the-calling-object-in-c – 2009-08-07 06:02:02