[英]Raising external object's events in C#
如果actions
是Panel,我是否能够提升其父级的Click
事件? 我目前有此代码,但Click
事件不是方法,因此此代码无效。
有谁知道我怎么能做到这一点?
actions.Click += delegate(object Sender, EventArgs e)
{
((Panel)Sender).Parent.Click();
}
不可能直接从另一个class
引发C# event
(即使它是public
)。 您可以提供一个方法(具有足够的访问修饰符),代表您引发event
并在另一个class
调用该方法。
顺便说一句,这可以通过反思,但我认为这是一个肮脏的黑客。
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 });
我使用反射和扩展方法实现了这一点,这样我只需调用以下方法就可以调用(在本例中)一个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);
}
它使用另一种扩展方法:
我可以想到为什么你想提出Click事件的唯一原因是你是在模拟用户输入。 您是在使用自动测试驱动程序还是其他类似的东西? 如果是这样,可能有更好的解决方案,而不是使用仅测试辅助方法来玷污代码。 这在谷歌首先出现,我不知道它是否有任何好处。
如果你试图在你的应用程序本身作为一种流量控制来做这件事,我会退一步看看这是否是正确的做法 - 它有点“闻起来很糟糕”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.