【发布时间】:2016-12-15 12:50:55
【问题描述】:
我有一个会写日志的课程。该类需要引发一个事件(在下面未说明的特定情况下),该事件将由一个类对其做出反应。我有下面的代码,但是一旦我尝试引发事件,我就会在指示的行上收到一个错误,即
对象引用未设置为对象的实例
知道我错过了什么吗?
//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)
{ ... }
}
【问题讨论】:
-
当您在
WriteLog(string message)中执行new LogEvent().OnWriteLog(args);时,您会创建一个新的LogEvent实例,它没有将WriteLog连接到处理程序,所以它当然仍然为空。同样在MyClass构造函数中,您创建一个LogEvent并连接WriteLog,但不要在任何地方存储LogEvent的实例。 -
有道理。我有这样的想法,并尝试了一些场景,但还没有成功。我觉得要求代码示例太愚蠢了,所以我现在继续尝试:)
-
您的答案的第 2 部分部分在我的代码中,但不在问题中。将更新问题。谢谢。
标签: c# events delegates custom-events