2013-06-26 36 views
0

我的問題最好用小代碼示例來描述;如何從事件中調用方法名稱?

public class ClassA { 
    public delegate void MyDelegate(EventArgs e); 
    public event MyDelegate MyEvent; 

    public void OnEvent(EventArgs e) { 
     if (MyEvent != null) 
      MyEvent(e); 
      // print "WhatIsMyName" here 
    } 
} 

public class ClassB { 

    public ClassB() { 
     ClassA a = new ClassA(); 
     a.MyEvent += WhatIsMyName; 
    } 

    public static void WhatIsMyName(EventArgs e) { 

    } 
} 

我猜我需要使用反射,但我不知道如何去了解它(甚至如果可能的話)。我也希望能夠獲得方法的類名。

+0

爲什麼你在這裏需要一個類的名字?你需要綁定一個方法作爲處理程序嗎? – JustCode

+2

如果有多個*處理程序訂閱了相同的事件,您想要什麼?如果它是已訂閱的匿名委託或lambda,你想要什麼?如果你能描述*爲什麼*你想/需要獲得這個名字,你可能會得到更好的幫助 - 這裏的總體目標是什麼?舉辦活動的目的之一是例如'ClassA'不必知道*關於發生'MyEvent'的其他代碼片段。 –

+0

請注意,您可以有任意數量的用戶參加活動。所以(假設它是可能的,我認爲它不是),你必須打印方法名稱的*列表*。 –

回答

0

您可以使用StackTrace類來查看應用程序的整個堆棧跟蹤。這會很慢,但應該工作。

查看了一些示例的GetFrameGetFrames方法。

編輯: 如果您使用的是.Net 4.5,那麼您也可以使用CallerMemberName屬性。如果它符合您的要求,這將是更快,更優雅的解決方案。

1

實際上,.NET 4.5中有一項新功能,稱爲「呼叫者信息」。

您可以獲取有關來電者這樣一些信息:

public void Foo([CallerMemberName]string sourceMemberName = "", 
       [CallerFilePath]string sourceFilePath = "", 
       [CallerLineNumber]int sourceLineNo = 0) 
{ 
    Debug.WriteLine("Member Name : " + sourceMemberName); 
    Debug.WriteLine("File Name : " + sourceFilePath); 
    Debug.WriteLine("Line No. : " + sourceLineNo); 
} 


的更多信息: Caller Info - codeguru.com

+0

但是它看起來像OP正在尋找與此相反的東西 - 「我只是/剛剛調用了一個委託 - 我調用的函數的名稱是什麼(d)?」 –

+0

哦,你說得對,我錯過了。 –

相關問題