2011-05-24 27 views
3

是否有可能?如何獲取此方法的調用者類

我想類(如富)的名字被調用我的方法(如myMethod的)

(和方法在另一個類(像我))

,如:

class foo 
{ 
    i mc=new i; 
    mc.mymethod(); 

} 
class i 
{ 
    myMethod() 
    {........ 
     Console.WriteLine(InvokerClassName);// it should writes foo 
    } 
} 

在此先感謝

+1

我不禁納悶,爲什麼* *您想知道... – forsvarir 2011-05-24 09:52:18

回答

9

您可以使用StackTrace制定出呼叫者 - 但是這是假設沒有內聯回事。堆棧跟蹤並不總是100%準確。喜歡的東西:

StackTrace trace = new StackTrace(); 
StackFrame frame = trace.GetFrame(1); // 0 will be the inner-most method 
MethodBase method = frame.GetMethod(); 
Console.WriteLine(method.DeclaringType); 
+0

是否有交付堆屬性逐幀跟蹤,還是我們必須解析字符串屬性? – 2011-05-24 09:53:00

+0

@Jen:你在哪裏可以看到我提供的代碼中的任何字符串屬性? – 2011-05-24 09:53:32

+0

提及內聯+1。除非使用屬性來顯式禁用它,否則這會很危險,甚至在Debug和Release版本中可能會有不同的工作方式。 – takrl 2011-05-24 09:58:12

0

我發現休耕: http://msdn.microsoft.com/en-us/library/hh534540.aspx

// using System.Runtime.CompilerServices 
// using System.Diagnostics; 

public void DoProcessing() 
{ 
    TraceMessage("Something happened."); 
} 

public void TraceMessage(string message, 
     [CallerMemberName] string memberName = "", 
     [CallerFilePath] string sourceFilePath = "", 
     [CallerLineNumber] int sourceLineNumber = 0) 
{ 
    Trace.WriteLine("message: " + message); 
    Trace.WriteLine("member name: " + memberName); 
    Trace.WriteLine("source file path: " + sourceFilePath); 
    Trace.WriteLine("source line number: " + sourceLineNumber); 
} 

// Sample Output: 
// message: Something happened. 
// member name: DoProcessing 
// source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs 
// source line number: 31