簡體   English   中英

在C#中引發外部對象的事件

[英]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);
}

它使用另一種擴展方法:

  • 從LinkLabel獲取私有屬性(需要創建LinkLabelLinkClickedEventArgs對象)
  • 調用OnLinkClicked方法(將觸發事件

根據您正在使用的框架,您不必手動調用父, WPFASP.NET上的click事件,例如元素樹上的bubble事件。

如果這不是一個選項,你可以像Mehrdad建議的那樣做。

我可以想到為什么你想提出Click事件的唯一原因是你是在模擬用戶輸入。 您是在使用自動測試驅動程序還是其他類似的東西? 如果是這樣,可能有更好的解決方案,而不是使用僅測試輔助方法來玷污代碼。 在谷歌首先出現,我不知道它是否有任何好處。

如果你試圖在你的應用程序本身作為一種流量控制來做這件事,我會退一步看看這是否是正確的做法 - 它有點“聞起來很糟糕”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM