2011-06-09 76 views
11

是否有可能檢測到事件是否有聽衆? (如果沒有人需要,我需要處理我的事件提供者對象)檢查事件是否有聽衆?

+0

請參閱我的編輯..... – 2011-06-09 11:02:00

回答

19

假設類是在第三方庫,它可以「T進行修改:

public class Data 
    { 
     public event EventHandler OnSave; 
     //other members 
    } 

在你的程序:

Data d = new Data(); 
    d.OnSave += delegate { Console.WriteLine("event"); }; 
    var handler = typeof(Data).GetField("OnSave", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(d) as Delegate; 

    if (handler == null) 
    { 
     //no subscribers 
    } 
    else 
    { 
     var subscribers = handler.GetInvocationList(); 
     //now you have the subscribers 
    } 
+0

它似乎調用GetInvocationList並不是真的必要,檢查處理器爲null就足夠了。我對麼? – user626528 2011-06-12 11:03:43

+0

@ user626528:是的,你是對的。在這個例子中,我展示了一些在某些情況下可能有用的東西。 – 2011-06-12 14:18:47

+2

如果在沒有添加OnSave事件時處理程序將爲空,那麼上面的代碼應該有空檢查,否則會出錯。 – Justin 2014-02-18 20:49:28

4

您可以檢查事件是否爲!= null。

順便說一句,在C#中,你需要這個檢查每次引發事件:

if (TheEvent != null) { 
    TheEvent(this, e); 
} 

,究其原因正是以檢查事件有任何監聽器。

編輯
因爲你不能從類外部訪問TheEvent,你可以實現,做檢查的方法:

public class TheClass { 
    public bool HasEventListeners() { 
     return TheEvent != null; 
    } 
} 
+0

我需要在對象之外檢查它,因爲它是由第三方製作的。我需要檢查是否有人訂閱了對象的事件,並在沒有訂閱的情況下處置它。 – user626528 2011-06-09 10:47:00

+0

我不認爲你可以,你需要一個方法包裝 – Simone 2011-06-09 10:50:12

+0

看到編輯的答案。 – Simone 2011-06-09 10:51:59

0
void Main() 
{ 
    Console.WriteLine(ContainsOnSomethingEvent()); // false 
    OnSomething += (o,e) => {}; 
    Console.WriteLine(ContainsOnSomethingEvent()); // true 
} 
EventHandler mOnSomething; 

event EventHandler OnSomething { 
    add { mOnSomething = (EventHandler)EventHandler.Combine(mOnSomething, value); } 
    remove { mOnSomething = (EventHandler)EventHandler.Remove(mOnSomething, value); } 
} 

public bool ContainsOnSomethingEvent() { 
    return mOnSomething != null && mOnSomething.GetInvocationList().Length > 0; 
}