C# 提升外部对象';C语言中的s事件#

C# 提升外部对象';C语言中的s事件#,c#,.net,events,raise,C#,.net,Events,Raise,如果actions是一个面板,我是否能够引发其父级的Click事件? 目前我有此代码,但是单击事件不是一个方法,因此此代码无效。 有人知道我怎样才能做到这一点吗 actions.Click += delegate(object Sender, EventArgs e) { ((Panel)Sender).Parent.Click(); } 无法直接从另一个类引发C#事件(即使它是公共)。您可以提供一个代表您引发事件的方法(带有足够的访问修饰符),并在另一个类中调用该方法 顺便说一下,这

如果
actions
是一个面板,我是否能够引发其父级的
Click
事件? 目前我有此代码,但是
单击事件不是一个方法,因此此代码无效。
有人知道我怎样才能做到这一点吗

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

无法直接从另一个
引发C#
事件
(即使它是
公共
)。您可以提供一个代表您引发
事件的方法(带有足够的访问修饰符),并在另一个
类中调用该方法


顺便说一下,这是可能的,但我认为这是一个脏的黑客。

取决于你使用的框架是什么,你不必手动调用父事件上的点击事件,例如在元素树上发生冒泡事件。


如果这不是一个选项,您可以按照Mehrdad的建议执行。

CLR中引发事件的大多数类型都有一个受保护的[EventName]方法来处理引发事件。您可以使用反射“从外部”调用此受保护的方法:

 Control parent = ((Control)sender).Parent;
 Type parentType = parent.GetType();
 MethodInfo onClickMethod = parentType.GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic);

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

我能想到的唯一原因是,如果您正在模拟用户输入,那么您希望引发单击事件。你是在开发自动测试驱动程序还是类似的东西?如果是这样的话,可能有比用只测试的辅助方法玷污代码更好的解决方案。第一个出现在谷歌,我不知道它是否有任何好处


如果您试图在应用程序本身中作为一种流控制来执行此操作,我会后退一步,看看这是否是正确的操作—它有点“难闻”。

我使用反射和扩展方法实现了此操作,这样我就可以通过调用(在本例中)链接标签单击事件:

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方法(将触发事件

我是否可以创建一个新的面板类继承旧的面板类,然后添加一个方法来引发单击事件?很抱歉,这不是一个肮脏的把戏,它在AoP中有自己的位置,这样您就不会为类中的每个属性编写NotifyPropertyChanged,也不会在过程中使模型混乱。我正在尝试使单击事件冒泡,我没有使用WPF、 所以它不会自动发生。