我的目标是创建一个事件,在Project#1中引发事件,让Project#2订阅该事件,以便我可以在Project#2中找到一些代码。我被建议这样做,因为我无法引用Project#2中的代码。
我对事件并不熟悉,并且一直在研究最后一小时。是否有人可以提供有关如何执行此操作的示例代码?我现在所做的不起作用。
// Creating the event
public event EventHandler UpdateUIEvent;
// Raising the event in Project #1
protected override void ResetProperties()
{
this.filePath = string.Empty;
EventArgs e = new EventArgs();
UpdateUIEvent(this, e); // this kills my program
}
// Subscribing to the event in Project #2
protected override void ClearAll()
{
boEncrypt.UpdateUIEvent += new EventHandler ?? // Not sure how to subscribe here
tbFile.text = string.Empty;
}
答案 0 :(得分:1)
您已关闭...请照常阅读the docs,以便更好地了解需要采取的措施。
对于您的代码,这是我们要做的事情:
在项目1中,结合Michael HB的好建议,始终检查是否有任何订阅者。
public class ProjectOneClass
{
public event EventHandler UpdateUIEvent;
// other stuff
protected override void ResetProperties()
{
this.filePath = string.Empty;
EventArgs e = new EventArgs();
var handler = UpdateUIEvent;
if (handler != null)
UpdateUIEvent(this, e);
}
}
然后在项目2中,您必须引用该事件,这意味着您还需要对包含它的类的引用。您可以在项目2中的类中定义一个方法,该方法与项目1中的事件具有相同的签名。在您的情况下(在许多情况下),此签名为void (object sender, EventArgs e)
。 EventHandler
是带有此签名的预定义delegate。
"订阅"事件是将新方法添加到处理程序,例如pOne.UpdateUIEvent += SomeMethodWithTheSameSignature;
您基本上说"每当调用UpdateUIEvent时,也要调用其他方法"。
现在我们知道我们可以在事件触发时调用一个方法,我们需要定义该事件。如果您想在事件触发时调用ClearAll()
,那么方法正文中会发生什么。
public class ProjectTwoClass
{
public ProjectOneClass pOne;
// other stuff
public ProjectTwoClass()
{
pOne = new ProjectOneClass();
pOne.UpdateUIEvent += POneOnUpdateUIEvent;
}
public void POneOnUpdateUIEvent(object sender, EventArgs eventArgs)
{
ClearAll();
}
private void ClearAll()
{
tbFile.Text = string.Empty; // could probably just call tbFile.Clear();
}
}
答案 1 :(得分:0)
在举起活动之前,您应该始终检查它是否为空。
protected override void ResetProperties()
{
this.filePath = string.Empty;
EventArgs e = new EventArgs();
var handler = UpdateUIEvent;
if(handler != null)
UpdateUIEvent(this, e);
}
即使你在不同的项目中,你也应该只关注“公共”关键字(内部或私人不起作用)。
在项目#2中,你将拥有
protected overeride void ClearAll()
{
boEncrypt.UpdateUIEvent += yourFunctionToTriggerWhenTheEventIsRaised;
tbFile.text = string.Empty;
}