代码之家  ›  专栏  ›  技术社区  ›  anonymous coward

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

  •  7
  • anonymous coward  · 技术社区  · 15 年前

    如果 actions 是一个小组,我能举起 Click 它的父级事件? 我现在有这个代码,但是 点击 事件不是方法,因此此代码无效。
    有人知道我怎样才能做到这一点吗?

    actions.Click += delegate(object Sender, EventArgs e)
    {
        ((Panel)Sender).Parent.Click();
    }
    
    5 回复  |  直到 14 年前
        1
  •  9
  •   Mehrdad Afshari    15 年前

    不可能提高C# event 直接从另一个 class (即使是 public )您可以提供一个方法(具有足够的访问修饰符),该方法将引发 事件 代表您,并在另一个方法中调用该方法 .

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

        2
  •  6
  •   Fredrik Mörk    15 年前

    在引发事件的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 });
    
        3
  •  2
  •   Dinis Cruz    14 年前

    我使用反射和扩展方法实现了这一点,这样我只需调用(在本例中)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方法(它将激发事件
        4
  •  1
  •   MichaC    15 年前

    根据您可能使用的框架,您不必手动调用父级上的Click事件, WPF ASP.NET 例如,元素树上的气泡事件。

    如果这不是一个选择,你可以像梅尔达建议的那样做。

        5
  •  1
  •   David Pope    15 年前

    我能想到的唯一原因是,如果您正在模拟用户输入,那么您为什么要引发Click事件。你是在研究自动测试驱动程序还是类似的东西?如果是这样,可能会有比用仅测试辅助方法玷污代码更好的解决方案。 This 在谷歌排名第一,我不知道这有什么好处。

    如果您正试图在应用程序本身中将其作为一种流控制进行操作,那么我将后退一步,看看这是否是正确的操作——它有点“臭味难闻”。