2011-06-09 18 views

cevap

19

sınıf bir 3. parti kütüphanede olduğunu ve can varsayalım:

DÜZENLEME
sınıfın dışından TheEvent erişemez olduğundan, denetimi yapar bir yöntem uygulayabilir 't değiştirilebilir:

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

Programınızda:

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

ItInvocationList gerçekten gerekli değil çağırıyor görünüyor, null için işleyici yeterlidir. Doğrumuyum? – user626528

+0

@ user626528: evet siz haklısınız. Bu örnekte bazı durumlarda yararlı olabilecek bir şey gösteriyorum. –

+2

Bir OnSave olayı eklenmediğinde işleyici null olursa, yukarıdaki kod bir null çeke sahip olmalı ya da başka bir hata vermelidir. – Justin

4

Olay olup olmadığını kontrol edebilirsiniz! = Null. Bu her zaman kontrol ihtiyaç C# arada

, Bir olayı:

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

ve sebebi olay herhangi dinleyicisi olup olmadığını kontrol etmek için tam olarak bu.

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

3. taraf tarafından üretildiği için nesnenin dışından kontrol etmem gerekiyor. Birinin nesne olayı için abone olup olmadığını kontrol etmem ve eğer abonelik yoksa bertaraf etmeliyim. – user626528

+0

Yapabileceğinizi sanmıyorum, bir yöntem sargısına ihtiyacınız var – Simone

+0

düzenlenmiş cevaba bakın. – Simone

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; 
} 
İlgili konular