我的表单上有一堆按钮,在我的代码中的某个位置,我想强制Click
事件触发。我可以这样做:
if (myButton == btnFoo)
btnFoo_Click(this, new EventArgs());
else if (myButton == btnBar)
btnBar_Click(this, new EventArgs());
else if // blah blah
...
显然这并不理想。这看起来像一个反射的情况,但我找不到合适的方法来做到这一点,例如
var ei = myButton.GetType().GetEvent("Click"); // so far so good;
var mi = ei.GetRaiseMethod(); // always returns null - no good!
GetRaiseMethod的文档。
那么如何强制点击代码运行?
答案 0 :(得分:4)
一般情况下,你不能。事件的重点是允许客户订阅和取消订阅 - 应该由发布者来举起活动。甚至 一个GetRaiseMethod
的事实在我看来有些奇怪 - 而且在C#中不受支持(你只能指定添加/删除方法)。
另一种方法是拥有Dictionary<Button, EventHandler>
或类似的东西,并在那里注册所有事件处理程序......但您可能想要反思为什么要强制点击事件有效地开火了。也许有一个更好的设计可以避免这是一个问题。
答案 1 :(得分:4)
使用PerformClick方法:
myButton.PerformClick();
也许你必须投射到Button,我无法从你的片段中分辨出来。我假设你不再需要追求反射代码了:)
答案 2 :(得分:1)
我有类似的问题。我有一个控件,点击时会引发点击事件。我想在按下快捷键时引发事件,这由我表单上的组件监视。为此,我将以下代码添加到我的自定义控件中。
public void PerformClick()
{
OnClick(new EventArgs());
}
然后我只需点击按钮
ctl.PerformClick();
答案 3 :(得分:0)
Jon Skeet是对的;就“合同”而言,有一个add
和remove
方法,就是这个方法。实际上,无法保证事件是作为具有支持多播委托的“类字段”事件实现的。可以存在几乎任何支持数据结构来存储每个回调(或者根本不存在)。因此,对象上的“引发事件”通常 没有明确定义。
编辑:删除基于反射的建议。和@Hans Passant一起去。