2016-12-15 5 views
0

Ich habe eine Klasse, die ein Protokoll schreiben wird. Die Klasse muss ein Ereignis auslösen (unter bestimmten Umständen, die unten nicht angegeben sind), die von einer Klasse dazu veranlasst werden, darauf zu reagieren. Ich habe den Code unten, aber sobald ich versuche, den Fall zu erhöhen, bekomme ich einen Fehler auf der Linie, wie angegeben, dassFehler beim Anheben des benutzerdefinierten Ereignisses

Objektverweis nicht auf eine Instanz eines Objekts festgelegt

Beliebig Idee, was ich vermisse?

//1. Class where event is registered 
    public class LogEvent 
    { 
     public delegate void WriteLogEventHandler(object Sender, WriteLogEventArgs e); 
     public event WriteLogEventHandler WriteLog; 

     public class WriteLogEventArgs : EventArgs 
     { 
      public string Message { get; set; } 

      public WriteLogEventArgs(string message) : base() 
      { 
       Message = message; 
      } 
     } 

     //Raise the event. 
     internal void OnWriteLog(WriteLogEventArgs e) 
     { 
      WriteLog(this, e); //Error here. Seems like WriteLog is null 
     } 

//2. Class where event is raised. 
public class Logs 
{ 
    public static void WriteLog(string message) 
    { 
     LogEvent.WriteLogEventArgs args = new LogEvent.WriteLogEventArgs(message); 
     new LogEvent().OnWriteLog(args); 
    } 
} 

//3. Class where event should be consumed 
public class MyClass() 
{ 
    private LogEvent _logEvent; 
    public MyClass() 
     { 
      //Subscribe to event: 
      _logEvent = new LogEvent(); 
      _logEvent.WriteLog += (sender, args) => { DoSomething(args.Message); }; 
     } 

    public void DoSomething(string message) 
    { ... } 
} 
+1

Wenn Sie 'neues LogEvent tun() OnWriteLog (args);.' In 'WriteLog (string message)' Sie eine neue Instanz von 'LogEvent' erstellen, die nicht' WriteLog' zu einem verdrahtet haben Handler, so ist es natürlich immer noch null. Auch im 'MyClass'-Konstruktor erstellen Sie ein' LogEvent' und verdrahten 'WriteLog', speichern dann aber nicht die Instanz von' LogEvent'. –

+0

Macht Sinn. Ich dachte so etwas und habe ein paar Szenarien ausprobiert, aber noch keinen Erfolg. Ich fühle mich zu dumm, um nach einem Codebeispiel zu fragen, also werde ich es weiter versuchen :) –

+0

Teil 2 deiner Antwort ist teilweise in meinem Code, aber nicht in der Frage. Wird die Frage aktualisieren. Vielen Dank. –

Antwort

0

Zwei Fragen:

  • Sie erhöhen das Ereignis ob jemand ihm abonniert hat. Tun Sie das nicht - Sie wird erhalten Sie eine NullReferenceException, wenn Sie WriteLog(this, e) aufrufen, wenn WriteLog Null ist. In C# 6 ist es einfach, dies zu vermeiden:

    WriteLog?.Invoke(this, e); 
    
  • Sie auf das Ereignis abonnieren auf einer anderen LogEvent Instanz als derjenige, der das Ereignis zu erhöhen. Dies ist mehr ein Design-Problem als alles andere - es macht keinen Sinn für ein einzelnes Log-Ereignis, eine Liste von Abonnenten zu haben. Stattdessen sollten Sie ein Logger oder ähnliches haben, das die Teilnehmer (über ein Ereignis) hat, dann wird jedes LogEvent an diese Teilnehmer weitergegeben. Sie würden einenLogger erstellen, es abonnieren und dann WriteLog auf der gleichen Instanz aufrufen.

+0

Punkt 1 ist sehr praktisch dank (obwohl es sollte WriteLog?. Invoke und nicht WriteLine.Invoke). Punkt 2 Ich bin mir noch nicht sicher, wie ich es lösen soll. Laut Feedback an Michael fühle ich mich zu dumm, um nach einem Codebeispiel zu fragen, also werde ich es weiter versuchen :). Danke für die Antwort. –

Verwandte Themen