如果actions
是一個Panel,我可以提高其父項的Click
事件嗎? 我目前有此代碼,但Click
事件不是一種方法,所以此代碼無效。
有誰知道我可以做到這一點?在C#中提高外部對象的事件
actions.Click += delegate(object Sender, EventArgs e)
{
((Panel)Sender).Parent.Click();
}
如果actions
是一個Panel,我可以提高其父項的Click
事件嗎? 我目前有此代碼,但Click
事件不是一種方法,所以此代碼無效。
有誰知道我可以做到這一點?在C#中提高外部對象的事件
actions.Click += delegate(object Sender, EventArgs e)
{
((Panel)Sender).Parent.Click();
}
這是不可能提出一個C#event
直接從另一class
(即使是public
)。您可以提供一種方法(具有足夠的訪問修飾符),以您的名義提出event
,並在其他class
中調用該方法。
順便說一句,這是可能的反思,但我認爲這是一個骯髒的黑客。
引發事件的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 });
我能想到的,你爲什麼會想提高Click事件是,如果你是模擬用戶輸入的唯一原因。你正在研究一個自動化的測試驅動程序或類似的東西嗎?如果是這樣,可能會有更好的解決方案,而不是僅使用僅測試輔助方法玷污代碼。 This在谷歌首先出現,我不知道如果它是好的。
如果你想在應用程序本身中將它作爲一種流控制,我會退後一步,看看這是否是正確的做法 - 它有點「不好」 。
我實現此使用反射和擴展方法,使得我可以調用(在這種情況下)將LinkLabel點擊事件通過只調用:
var link = new LinkLabel()'
link.Text = "Some link";
link.click();
點擊()方法是一個C#擴展方法:
public static void click(this LinkLabel linkLabel)
{
var e = new LinkLabelLinkClickedEventArgs((LinkLabel.Link)(linkLabel.prop("FocusLink")));
linkLabel.invoke("OnLinkClicked", e);
}
它採用另一種擴展方法:
我可以創建一個新的面板類繼承舊的一個事件,然後添加,以提高Click事件的方法? – 2009-04-26 07:11:59
是的。你應該這樣做。 – 2009-04-26 07:14:17