C#:如何使用反射调用事件?

时间:2010-10-17 16:31:30

标签: c# winforms

我的表单上有一堆按钮,在我的代码中的某个位置,我想强制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的文档。

那么如何强制点击代码运行?

4 个答案:

答案 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是对的;就“合同”而言,有一个addremove方法,就是这个方法。实际上,无法保证事件是作为具有支持多播委托的“类字段”事件实现的。可以存在几乎任何支持数据结构来存储每个回调(或者根本不存在)。因此,对象上的“引发事件”通常 没有明确定义。

编辑:删除基于反射的建议。和@Hans Passant一起去。