Tom*_*ski 24 c# events delegates event-handling
我想创建一个方法,将事件作为参数,并向其添加eventHandler以正确处理它.像这样:
我有两个事件:
public event EventHandler Click;
public event EventHandler Click2;
Run Code Online (Sandbox Code Playgroud)
现在我想将一个特定事件传递给我的方法(伪代码):
public AttachToHandleEvent(EventHandler MyEvent)
{
MyEvent += Item_Click;
}
private void Item_Click(object sender, EventArgs e)
{
MessageBox.Show("lalala");
}
ToolStripMenuItem tool = new ToolStripMenuItem();
AttachToHandleEvent(tool.Click);
Run Code Online (Sandbox Code Playgroud)
可能吗?
我注意到这段代码工作正常,并返回到我的项目,并注意到当我传递在我的类中声明的事件时,它可以工作,但是当我从其他类传递事件时,它仍然无效.
我得到的是这个错误:
事件'System.Windows.Forms.ToolStripItem.Click'只能出现在+ =或 - =的左侧
P D*_*ddy 25
我的原始答案适合于定义该事件的类中,但您已经更新了您的问题,以反映您希望从定义类之外完成此操作,所以我已经打败了它.
只有定义事件的类才能引用事件使用的隐式委托变量.从该类外部,您只能访问add和remove方法,通过+=和-=.这意味着你不能直接做你所要求的.但是,您可以使用功能方法.
class A{
public event EventHandler Event1;
public void TriggerEvent1(){
if(Event1 != null)
Event1(this, EventArgs.Empty);
}
}
class B{
static void HandleEvent(object o, EventArgs e){
Console.WriteLine("Woo-hoo!");
}
static void AttachToEvent(Action<EventHandler> attach){
attach(HandleEvent);
}
static void Main(){
A a = new A();
AttachToEvent(handler=>a.Event1 += handler);
a.TriggerEvent1();
}
}
Run Code Online (Sandbox Code Playgroud)
我是这样做的:
public AttachToHandleEvent(Object obj, string EventName)
{
EventInfo mfi = obj.GetType().GetEvent(EventName);
MethodInfo mobj = mfi.GetAddMethod();
mobj.Invoke(obj, new object[] { Item_Click});
}
private void Item_Click(object sender, EventArgs e)
{
MessageBox.Show("lalala");
}
ToolStripMenuItem tool = new ToolStripMenuItem();
AttachToHandleEvent(tool "Click");
Run Code Online (Sandbox Code Playgroud)
谢谢大家的建议.没有你的帮助,这个解决方案是无法完成的.
| 归档时间: |
|
| 查看次数: |
30015 次 |
| 最近记录: |