2014-12-04 8 views
7

Sınıfımdaki tüketicilerin dahili tanılama iletileri almak için bağlanabileceği bir olayım var. CA1009: Olay işleyicilerini doğru olarak bildirme

public event EventHandler<string> OutputRaised; 

Ben Neden CA1009 doğru olay işleyicileri beyan alıyorum bu işlevin

protected virtual void OnWriteText(string e) 
    { 
     var handle = this.OutputRaised; 
     if (handle != null) 
     { 
      var message = string.Format("({0}) : {1}", this.Port, e); 
      handle(this, message); 
     } 
    } 

ile olay yükseltmek? Bulduğum tüm cevaplar benim senaryona gerçekten uygun görünmüyor ... Sadece anlamaya çalışırken, henüz gerçek bir katı olay ve delegelerim yok. CA1009 üzerinde

Referans: http://msdn.microsoft.com/en-us/library/ms182133.aspx

+0

[Olay işleyicileri C#] (http: //www.tutorialspoint. com/csharp/csharp_events.htm) || [EventHandler (TEventArgs)] (http://msdn.microsoft.com/en-us/library/db0etb8x%28v=vs.110%29.aspx) – MethodMan

cevap

12

EventHandler tip parametreli EventArgs'dan alması gerektiğini 'kurallar' e göre:

Olay işleyicisi yöntemleri iki parametre alır. Birincisi, System.Object türünde olup 'gönderen' olarak adlandırılmıştır. Olayı yükselten nesne budur. İkinci parametre, System.EventArgs türündendir ve 'e' adlı 'dur. Bu, olayla ilişkili verilerdir. örneğinde, bir dosya her açıldığında olay kaldırılırsa, olay olayı tipik olarak dosyanın adını içerir.

public class StringEventArgs : EventArgs 
{ 
    public string Message {get;private set;} 

    public StringEventArgs (string message) 
    { 
     this.Message = message; 
    } 

} 

ve eventhandler: Eğer olayı çağırdığınızda

public event EventHandler<StringEventArgs> OutputRaised; 

, sen offcourse StringEventArgs bir örneğini oluşturmak gerekir Senin durumunda

, yani böyle bir şey olabilir sınıfı:

protected virtual void OnWriteText(string message) 
{ 
    var handle = this.OutputRaised; 
    if (handle != null) 
    { 
     var message = string.Format("({0}) : {1}", this.Port, e); 
     handle(this, new StringEventArgs(message)); 
    } 
} 

ben Ayrıca, teorik olarak, kodunuzda yanlış bir şey olmadığını da eklemek istersiniz. Derleyici şikayet etmez ve kodunuz çalışır. EventHandler<T> temsilci, type parametresinin EventArgs'dan devralması gerektiğini belirtmez. Bir olayı bildirmek için 'tasarım kurallarını' ihlal ettiğinizi gösteren FxCop. .NET

+0

Tamam, ben sorunu beri (olacaktı düşündüm 'string' 'EventArgs'ı devralmaz.Şüpheliğimi doğruladığın için teşekkür ederim,' 'works' 'kodunu biliyorum, sadece hatanın sebebini daha ayrıntılı olarak bilmek istedim. – Calvin

3

Olaylar genellikle Senin ki Sorunun bu tahmin ediyorum gelmez EventArgs bazı türevini içermelidir.

olay args tanımlayın

olayla yayınlanacak:

public class StringEventArgs : EventArgs 
{ 
    public StringEventArgs(string message) { this.Message = message; } 
    public string Message { get; private set; } 
} 
senin Olay bildirimi değiştirin ve yöntemi yayınlamak

:

public event EventHandler<StringEventArgs> OutputRaised; 

protected virtual void OnWriteText(string e) 
{ 
    var handle = this.OutputRaised; 
    if (handle != null) 
    { 
     var message = string.Format("({0}) : {1}", this.Port, e); 
     handle(this, new StringEventArgs(message)); 
    } 
}