我创建了一个小应用程序,但我现在想要合并某些类型的日志,可以通过列表框查看。数据来源可以从任意数量的地方发送。我创建了一个新的日志记录类,它将传递一个委托。我认为我接近解决方案,但我收到NullReferenceException,我不知道正确的解决方案。以下是我尝试做的一个例子:
Class1 where the inbound streaming data is received.
class myClass
{
OtherClass otherClass = new OtherClass();
otherClass.SendSomeText(myString);
}
记录类
class OtherClass
{
public delegate void TextToBox(string s);
TextToBox textToBox;
Public OtherClass()
{
}
public OtherClass(TextToBox ttb)
{
textToBox = ttb;
}
public void SendSomeText(string foo)
{
textToBox(foo);
}
}
表格
public partial class MainForm : Form
{
OtherClass otherClass;
public MainForm()
{
InitializeComponent();
otherClass = new OtherClass(this.TextToBox);
}
public void TextToBox(string pString)
{
listBox1.Items.Add(pString);
}
}
每当我在myClass中收到数据时,都会抛出错误。您可以给予任何帮助。
答案 0 :(得分:1)
删除空构造函数并传递适当的委托。
class OtherClass
{
public delegate void TextToBox(string s);
private readonly TextToBox textToBox;
public OtherClass(TextToBox textToBox)
{
if (textToBox == null)
throw new ArgumentNullException("textToBox");
this.textToBox = textToBox;
}
public void SendSomeText(string foo)
{
textToBox(foo);
}
}
答案 1 :(得分:1)
更改您的OtherClass以检查null:
class OtherClass
{
public delegate void TextToBox(string s);
TextToBox textToBox;
Public OtherClass()
{
}
public OtherClass(TextToBox ttb)
{
textToBox = ttb;
}
public void SendSomeText(string foo)
{
var handler = this.TextToBox;
if(handler != null)
{
textToBox(foo);
}
}
}
现在您获得异常的原因是因为在您的myClass中创建新的OtherClass时,您没有提供委托应该“指向”的方法。因此,当你是OtherClass调用textToBox(foo);
时,它背后没有任何方法,它会爆炸。
答案 2 :(得分:1)
你应该传入myClass构造函数你在MainForm中创建的OtherClass实例,不要在myClass中创建OtherClass实例,它不是你附加处理程序的实例。
答案 3 :(得分:1)
在myClass中,您没有调用带有TextToBox的重载的OtherClass构造函数,因此textToBox(foo)失败,因为尚未设置textToBox。
你能展示myClass初始化和调用的代码吗?