2010-04-01 116 views
24

我想创建一个方法,将事件作为参数,并添加eventHandler来正确处理它。就像这样:如何将事件传递给方法?

我有两个事件:

public event EventHandler Click; 
public event EventHandler Click2; 

现在我想以一个特定的事件传递给我的方法是这样的(伪):

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); 

这可能吗?

我注意到这段代码工作正常,并返回到我的项目中,并注意到当我传递一个在我的类中声明的事件时,它可以工作,但是当我从其他类传递事件时,它仍然不起作用。

我得到的是这样的错误:

The event 'System.Windows.Forms.ToolStripItem.Click' can only appear on the left hand side of += or -=

+0

@OJ是的,你太聪明了! – 2010-04-01 12:43:02

+0

@Petar Minchev我不知道为什么......你是第一个帮助我的人。谢谢。 – 2010-04-01 12:44:04

+0

我已更新问题以反映我处理的问题 – 2010-04-01 12:51:10

回答

23

我原来的答复是适合从定义事件类中,但你既然更新您的问题,以反映您希望从定义类之外的做到这一点,所以我认为欲绝。

只有定义了一个事件可以指隐含委托变量,所述事件使用的类。从该课程以外,您只能通过+=-=访问addremove方法。这意味着你不能直接做你正在问的东西。但是,您可以使用功能性方法。

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(); 
    } 
} 
+0

我已经检查过我的问题的更新版本,不幸的是它不起作用,你能帮我吗? – 2010-04-01 12:52:21

+0

我试过这种方法,它工作。 – hakan 2014-07-22 16:27:39

2

只要写tool.Click += Item_Click;

编辑:从MSDN“事件只能从类或者他们(它)的声明结构中调用”。所以你试图做的是不可能的。你能详细说明你的需求吗?为什么你想要传递一个事件作为参数?

+0

哦..所以我的代码在别处不好。谢谢! – 2010-04-01 12:38:08

+1

它不是我的减数。你的回答是第一个,也是正确的。我试过这段代码的更长版本,它不想工作。我在这里写了这个问题来寻求帮助,但是当你回答时,我已经从这里重新检查了这个简单的例子,它在你写的时候是正确的。谢谢 。 – 2010-04-01 12:41:15

+1

仍然有问题。对不起,这是价格,并专注于当我有一个错误的情况下 – 2010-04-01 12:53:08

3

这是不可能的。如果符合您的需求,您可以使用委托而不是事件。

1
delegate void doIt(object sender, object data); 
    event doIt OnDoIt; 

    void add(doIt theDel) 
    { 
     OnDoIt += theDel; 
    } 

    void doIt1(object a, object b) 
    { 
    } 

    void doIt2(object a, object b) 
    { 
    } 

    void add() 
    { 
     add(doIt1); 
     add(doIt2); 
    } 
5

我做了这样的:

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"); 

谢谢大家的意见。没有你的帮助,这个解决方案是无法完成的。

+0

这段代码有一些问题。有一个解决方案是在这里:http://msdn.microsoft.com/en-us/library/ms228976%28v=vs.95%29.aspx#Y899 – cbp 2011-06-15 05:36:16

-1

你的问题建议你有一些机制错误: 你不可错过的活动!

你最想传递一个函数作为参数,因此调用方法将调用在某些时候,其他方法。用技术术语来说,这是一个代表。我建议使用已定义的Action类。下面是一个例子片断:

void MyFunction (string otherArguments, Action onFinished){ 
    ... 
    if (onFinished != null) 
     onFinished.Invoke(); 
} 

关于这样做的好处是,调用MyFunction的时候可以使用内联语法申报操作:

MyFunction("my other argument",()=>{ 
    ///do stuff here, which will be execuded when the action is invoked 
});