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视频解释应该如何处理这种情况?
类内部的事件通常有一个公共方法,类客户端使用该方法从类外部调用该事件:
public class Foo {
public event FooDelegate FooEvent;
public void RaiseFoo() {
if ( FooEvent != null ) FooEvent();
}
}
如果一个事件缺少这样的公共"触发器",这通常意味着由于某些原因您不应该能够从外部引发该事件。
在您的示例中,当然可以使用
引发事件form.Close();
with,除其他事项外,还引发事件。