我想在.NET中使用反射來訪問調用我的方法的對象。我認爲這是可能的查看堆棧跟蹤。我知道這是不安全的,因爲各種原因,但我只需要抓取並編制一些屬性值。使用C#反射訪問堆棧跟蹤對象
我該怎麼做?
更新:我是個白癡,我忘了說,這是在C#
我想在.NET中使用反射來訪問調用我的方法的對象。我認爲這是可能的查看堆棧跟蹤。我知道這是不安全的,因爲各種原因,但我只需要抓取並編制一些屬性值。使用C#反射訪問堆棧跟蹤對象
我該怎麼做?
更新:我是個白癡,我忘了說,這是在C#
如果一個靜態方法調用你呢?
如果他們把自己傳遞給你,那麼與呼叫者的合同會不會更好(更簡單)?
當然,但我沒有控制調用庫。我正在研究編寫命令歷史Launchy插件,他們的插件模型在某種程度上缺乏靈活性。我知道誰會打這個電話,我只需要一些方法來訪問它 – 2009-08-07 03:44:10
您可以使用堆棧跟蹤&的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);
}
}
了不起的信息,不知道。但我真的需要關於調用我的方法的實例的信息。 – 2009-08-07 04:43:29
您需要使用StackFrame對象構造函數,並將它傳遞給調用堆棧中的多個級別的整數。例如新的StackFrame(1)意味着調用者StackFrame(2)調用者的來電者 – bashmohandes 2009-08-07 05:43:45
var methodInfo = new StackFrame(1).GetMethod();
返回調用的方法編輯當前的方法。
請注意,編譯器可能會內聯或以其他方式優化對方法的調用(儘管聽起來像您可能不是這種情況),這會阻礙預期的行爲。爲了安全起見,與裝飾你的方法:
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
注意的是:這有悖於讓編譯器完成其工作。買者自負。
EDITED糟糕,我看到你想調用你的方法的實例。沒有辦法獲得這些信息。
感謝您的迴應。理論上VS調試器可以訪問的所有信息是否也適用於我?調試器可以在調用方法的實例中查找堆棧幀...... – 2009-08-07 03:57:14
您可能必須作爲調試器附加到進程才能獲得此級別的詳細信息。請參閱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
http://stackoverflow.com/a/10530629/8155 – 2013-02-08 13:54:17