在C#中引发外部对象的事件

时间:2009-04-26 07:06:15

标签: c# .net events raise

如果actions是专家组,我可以举起它的父母的Click事件吗? 我目前有此代码,但Click事件不是方法,因此此代码无效 有谁知道我怎么能做到这一点?

actions.Click += delegate(object Sender, EventArgs e)
{
    ((Panel)Sender).Parent.Click();
}

5 个答案:

答案 0 :(得分:9)

无法直接从另一个event提升C#class(即使它是public)。您可以提供一种方法(具有足够的访问修饰符),代表您提出event并在另一个class中调用该方法。

顺便说一句,这可以通过反思实现,但我认为这是一个肮脏的黑客。

答案 1 :(得分:6)

CLR中引发事件的大多数类型都有一个受保护的On [EventName]方法,它负责引发事件。您可以使用Reflection:

“从外部”调用此受保护的方法
 Control parent = ((Control)sender).Parent;
 Type parentType = parent.GetType();
 MethodInfo onClickMethod = parentType.GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic);

 onClickMethod.Invoke(parent, new object[] { e });

答案 2 :(得分:2)

我使用反射和扩展方法实现了这个,这样我就可以通过调用来调用(在本例中)一个LinkLabel click事件:

var link = new LinkLabel()'
link.Text = "Some link";
link.click();

click()方法是C#扩展方法:

    public static void click(this LinkLabel linkLabel)
{
    var e = new LinkLabelLinkClickedEventArgs((LinkLabel.Link)(linkLabel.prop("FocusLink")));
    linkLabel.invoke("OnLinkClicked", e);
}

使用另一种扩展方法:

  • 从LinkLabel获取私有属性(需要创建LinkLabelLinkClickedEventArgs对象)
  • 调用OnLinkClicked方法(将触发事件

答案 3 :(得分:1)

根据您正在使用的框架,您不必手动调用父,WPFASP.NET上的点击事件,例如元素树上的气泡事件。

如果这不是一个选项,你可以像Mehrdad建议的那样做。

答案 4 :(得分:1)

我能想到你想要提升Click事件的唯一原因是你是在模拟用户输入。您是在使用自动测试驱动程序还是其他类似的东西?如果是这样,可能有更好的解决方案,而不是使用仅测试辅助方法来玷污代码。 This首先出现在谷歌中,我不知道它是否有用。

如果您尝试将此作为应用程序本身的一种流控制,我会退后一步,看看这是否是正确的做法 - 它有点“闻起来很糟糕”。