[英]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.