C#:什么';从对象外部触发事件的预期替代物是什么?

C#:什么';从对象外部触发事件的预期替代物是什么?,c#,C#,C#已转到,例如: 不要编译,因为不能以这种方式触发事件 这似乎是语言设计者有意识的决定。他们似乎有意阻止“不良行为” 我正试图找到想要的替代品 实例: void ShowPopup(Form form) { ToolStripDropDown toolDrop = new ToolStripDropDown(); ToolStripControlHost toolHost = new ToolStripControlHost(form); toolHost.Margin =

C#已转到,例如:

不要编译,因为不能以这种方式触发事件

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

我正试图找到想要的替代品

实例:

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频道视频解释我应该如何处理这种情况?

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

public class Foo {
  public event FooDelegate FooEvent;

  public void RaiseFoo() {
     if ( FooEvent != null ) FooEvent();
  }      
}
如果某个事件缺少此类公共“触发器”,通常意味着出于某种原因,您不能从外部引发该事件

在您的示例中,事件当然可以通过

form.Close();

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

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

public class Foo {
  public event FooDelegate FooEvent;

  public void RaiseFoo() {
     if ( FooEvent != null ) FooEvent();
  }      
}
如果某个事件缺少此类公共“触发器”,通常意味着出于某种原因,您不能从外部引发该事件

在您的示例中,事件当然可以通过

form.Close();

除其他事项外,与也会引发事件。

我认为这与此无关。净额,本身;而是一个对象成员可访问性的函数。我认为这与此无关。净额,本身;而是对象成员可访问性的函数。问题来自于没有可用于抛出所需事件的公共方法的类。这只是意味着该类在内部引发事件,您可能不应该从外部引发事件。当然,就像使用私有方法一样,您可以通过反射来实现这一点,但这违背了某人的意图。获取来自Win32消息的事件。由于消息被循环捕获,它从消息循环内部引发。如果事件(消息)的真正原因没有发生,您自己引发此类事件的原因可能是什么?问题来自没有可用于引发所需事件的公共方法的类。这只是意味着该类在内部引发事件,您可能不应该从外部引发事件。当然,就像使用私有方法一样,您可以通过反射来实现这一点,但这违背了某人的意图。获取来自Win32消息的事件。由于消息被循环捕获,它从消息循环内部引发。如果事件的真正原因(信息)没有发生,你自己提出此类事件的原因是什么?