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)
{ ... }
}
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'. –
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 :) –
Teil 2 deiner Antwort ist teilweise in meinem Code, aber nicht in der Frage. Wird die Frage aktualisieren. Vielen Dank. –