【问题标题】:C#: What's the intended replacement for firing events from outside an object?C#:从对象外部触发事件的预期替换是什么?
【发布时间】:2011-12-30 05:03:26
【问题描述】:

C#已经转到great lengths to ensure that you cannot "fire" an event,例如:

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));
}

如果我不应该从对象外部触发事件 - 打算替换它的技术是什么?


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

【问题讨论】:

  • 我认为这与此无关。 NET,本身;而是对象成员可访问性的函数。

标签: c#


【解决方案1】:

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

public class Foo {
  public event FooDelegate FooEvent;

  public void RaiseFoo() {
     if ( FooEvent != null ) FooEvent();
  }      
}

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

在您的示例中,当然可以引发事件

form.Close();

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

【讨论】:

  • 问题来自于没有可用于抛出所需事件的公共方法的类。
  • 这只是意味着该类在内部引发事件,您可能不应该从外部这样做。当然,就像使用私有方法一样,您可以通过反射来做到这一点,但这违背了某人的意图。获取来自 Win32 消息的事件。由于消息被循环捕获,它是从消息循环内部引发的。如果事件的真正原因(消息)没有发生,您自己引发此类事件的原因是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2018-10-12
  • 2018-08-16
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2011-04-05
相关资源
最近更新 更多