2013-07-30 113 views
4

好吧,我真的不知道有什么错我的代码,并发生了什么事这么通过事件处理程序参数

class Activity有以下几种方法

protected struct EventParams 
    { 
     public object sender; 
     public EventArgs e; 
    } 
private EventParams WaitEventRaise_Body(ref EventHandler<EventArgs> handler, int timeout) 
    { 
     AutoResetEvent receiver = new AutoResetEvent(false); 
     EventParams result = new EventParams(); 

     EventHandler<EventArgs> handle = new EventHandler<EventArgs>((sender, e) => 
     { 
      result.e = e; 
      result.sender = sender; 
      receiver.Set(); 
     }); 

     handler += handle; 

     if (timeout > 0) 
     { 
      receiver.WaitOne(timeout); 
     } 
     else 
     { 
      receiver.WaitOne(); 
     } 

     return result; 
    } 

protected EventParams WaitEventRaise(ref EventHandler<EventArgs> handler) 
{ 
    return WaitEventRaise_Body(ref handler, -1); 
} 
protected EventParams WaitEventRaise(ref EventHandler<EventArgs> handler, int timeout) 
{ 
    return WaitEventRaise_Body(ref handler, timeout); 
} 

好了,所以我发现自己写了个遍再次AutoResetEvent的事情,所以我决定创建一个方法。但是,当我尝试从派生类中调用这个方法Bot : Activity

EventParams eventResult = WaitEventRaise(ref currentJob.JobReported); 

Error 30 The best overloaded method match for Project.Activity.WaitEventRaise(ref System.EventHandler)' has some invalid arguments

currentJob是一个Job : Activity类具有事件

public event EventHandler<JobReport> JobReported; 

class JobReport : EventArgs 

我想要做的是有一个机器人做的工作,实际上它创造了工作,并等待他们完成工作。工作班级在内部引发事件,使机器人班级注意到它完成了工作。和bot类等待,直到工作提出事件。所以我希望它清楚。对不起,英语不是我的母语。

+0

'事件处理'不能被推断为'事件处理'所以这是行不通的。 – James

+0

不适合JobReport的这项工作吗? 类JobReport:EventArgs的 – user1046403

+0

行我试图 EventParams eventResult = WaitEventRaise(参考文献currentJob.test); 其中 公共事件的EventHandler 测试; ,它给我的错误:事件测试只能出现在的+ =等等等等 – user1046403

回答

6

基本上是一个方法来判断,你不能指代类似事件那。有两个选项:

  • 通行证的代表 “增加一个处理程序” 并 “清除处理程序”:

    EventParams eventResult = 
        WaitEventRaise<JobReport>(handler => currentJob.JobReported += handler, 
               handler => currentJob.JobReported -= handler); 
    

    其中WaitEventRaise声明如下:

    EventParams WaitEventRaise<T>(Action<EventHandler<T>> add, 
               Action<EventHandler<T>> remove) 
              where T : EventArgs 
    
  • 通在EventInfo对应的事件,你会用反射来获取

这些都不是非常愉快的 - 这是一个问题的Rx对出现为好。

+1

Jon Skeet你是我的英雄谢谢! – user1046403

+0

但是不是有一个简短的解决方案,我的意思是我必须一遍又一遍地写这些东西。是不是有一个解决方案,我只是通过我必须工作并收到结果?只是单一的方法我的意思是 – user1046403

+0

@ user1046403:不。基本上,事件本身不是C#中的头等实体(也不是属性或构造函数...方法通过方法组转换进行排序)。 –

0

我不知道什么是Job类包含或什么currentJob.JobReported是,但是从错误WaitEventRaise方法需要System.EventHandler这就好比

private void MeMethod(object sender, EventArgs e) 
{ 
}