我希望能够找出一个事件是否被连接起来.我环顾四周,但我只找到了涉及修改包含事件的对象内部的解决方案.我不想这样做.
这是一些我认为可行的测试代码:
// Create a new event handler that takes in the function I want to execute when the event fires
EventHandler myEventHandler = new EventHandler(myObject_SomeEvent);
// Get "p1" number events that got hooked up to myEventHandler
int p1 = myEventHandler.GetInvocationList().Length;
// Now actually hook an event up
myObject.SomeEvent += m_myEventHandler;
// Re check "p2" number of events hooked up to myEventHandler
int p2 = myEventHandler.GetInvocationList().Length;
Run Code Online (Sandbox Code Playgroud)
不幸的是上面是错误的.我认为,当我将一个事件挂钩时,myEventHandler中的"invocationList"会自动更新.但不,事实并非如此.它的长度总是以一个为单位.
无论如何从包含事件的对象外面确定这个?
我想做这样的事情:
Button btn1 = new Button();
btn1.Click += new EventHandler(btn1_Click);
Button btn2 = new Button();
// Take whatever event got assigned to btn1 and assign it to btn2.
btn2.Click += btn1.Click; // The compiler says no...
Run Code Online (Sandbox Code Playgroud)
其中btn1_Click已在类中定义:
void btn1_Click(object sender, EventArgs e)
{
//
}
Run Code Online (Sandbox Code Playgroud)
当然,这不会编译("事件'System.Windows.Forms.Control.Click'只能出现在+ =或 - ="的左侧).有没有办法从一个控件获取事件处理程序并在运行时将其分配给另一个控件?如果那是不可能的,重复事件处理程序并在运行时将其分配给另一个控件吗?
有几点:我已经用Google搜索了一段时间,但却发现还没办法做到这一点.大多数尝试过的方法都涉及反射,因此如果您阅读我的问题并认为答案非常明显,请首先尝试在Visual Studio中编译代码.或者,如果答案确实非常明显,请随时给我打电话.谢谢,我真的很期待看到这是否可行.
我知道我可以这样做:
btn2.Click += new EventHandler(btn1_Click);
Run Code Online (Sandbox Code Playgroud)
这不是我在这里寻找的东西.
这也不是我想要的:
EventHandler handy = new EventHandler(btn1_Click);
Button btn1 = new Button();
btn1.Click += handy;
Button btn2 = new Button();
btn2.Click += handy;
Run Code Online (Sandbox Code Playgroud)