c#:从对象外部触发事件的预期替代品是什么?

本文关键字:替代品 是什么 事件 对象 外部 | 更新日期: 2023-09-27 18:19:13

c#已经尽了很大的努力来确保你不能"触发"一个事件,例如:

form.FormClosed(this, new FormClosedEventArgs(CloseReason.UserClosing));
button.Click(this, new EventArgs());
customer.AddressChanged(this, new EventArgs());

不编译,因为这样不能触发事件。

这似乎是语言设计者有意识的决定。他们似乎是有意阻止"不良行为"。

我正在寻找预期的替代品。

实际的例子:

void ShowPopup(Form form)
{
   ToolStripDropDown toolDrop = new ToolStripDropDown();
   ToolStripControlHost toolHost = new ToolStripControlHost(form);
   toolHost.Margin = new Padding(0);
   toolDrop.Padding = new Padding(0);
   toolDrop.Items.Add(toolHost);
   toolDrop.Closed += toolDrop_Closed;
   toolDrop.Show(screenLocation);
}
void toolDrop_Closed(object sender, ToolStripDropDownClosedEventArgs e)
{
   //The form's FormClosed event doesn't fire when shown as a popup
   //Fire the event manually
   form.FormClosed(this, new FormClosedEventArgs(CloseReason.UserClosing));
}

如果我不假定从对象外部触发事件- 打算取代它的技术是什么?


如果没有打算替换触发事件,是否有任何文章、书籍或Channel 9视频解释应该如何处理这种情况?

c#:从对象外部触发事件的预期替代品是什么?

类内部的事件通常有一个公共方法,类客户端使用该方法从类外部调用该事件:

public class Foo {
  public event FooDelegate FooEvent;
  public void RaiseFoo() {
     if ( FooEvent != null ) FooEvent();
  }      
}

如果一个事件缺少这样的公共"触发器",这通常意味着由于某些原因您不应该能够从外部引发该事件。

在您的示例中,当然可以使用

引发事件
form.Close();

with,除其他事项外,还引发事件。