Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将事件作为参数传递给方法_C#_Events - Fatal编程技术网

C# 将事件作为参数传递给方法

C# 将事件作为参数传递给方法,c#,events,C#,Events,我想将一个事件传递到一个方法中。我的代码如下,但是我应该为“XXX”类型写什么呢 你不知道——一个事件就像一个属性,它只是围绕一对方法的语法糖(添加/删除而不是属性的get/set)。事实上,F#确实以一等公民的身份揭露了事件,但C#没有:( 不过有几个选择: 传入一个“event subscriber”委托,您使用要添加的新处理程序调用该委托(可能还有一个event unsubscriber委托)。类似于以下内容: new Receiver(handler => button.Clic

我想将一个事件传递到一个方法中。我的代码如下,但是我应该为“XXX”类型写什么呢


你不知道——一个事件就像一个属性,它只是围绕一对方法的语法糖(添加/删除而不是属性的get/set)。事实上,F#确实以一等公民的身份揭露了事件,但C#没有:(

不过有几个选择:

  • 传入一个“event subscriber”委托,您使用要添加的新处理程序调用该委托(可能还有一个event unsubscriber委托)。类似于以下内容:

    new Receiver(handler => button.Click += handler, ...)
    
  • 传入
    EventInfo
    并订阅反射(urgh)

  • 看看反应式扩展框架,它有各种处理事件的方法(使用反射,但这意味着微软做反射工作,而不是你:)
如果我们了解全局,我们可以提供更好的建议-是否愿意向我们提供更多信息

编辑:好的,在这种情况下,您需要同时传入订阅和取消订阅代码:

using (new EventGuard<EventArgs>(h => Proxy.RetrieveCompleted += h, 
          h => Proxy.RetrieveCompleted -= h,
          HandleRetrieveCompleted))
{
    ...
}
使用(新的EventGuard(h=>Proxy.RetrieveCompleted+=h,
h=>Proxy.RetrieveCompleted-=h,
handler(已完成)
{
...
}

不可否认,这是相当令人讨厌的。你可能会发现其中有更好的东西,但这至少会起作用…

我编辑了这个问题,以提供更多我试图实现的内容的上下文。呃,这与多个类不能发布同一事件以及使用强引用的事件这一事实相结合(C程序内存泄漏的#1原因),再加上它们使用了令人难以置信的不必要的冗长语法(每次调用都必须手动检查空值?真的!)…我认为事件需要对C#5进行彻底返工。0@BlueRaja-DannyPflughoeft我认为代码冗长也是一样的,而且.NET事件还有更多的问题和限制。为了解决这个问题,或者至少有一个好的替代方案,我编写了一些有用的代码,请查看这篇文章:有关详细信息。@BlueRaja DannyPflughoeft:C#6中的null条件运算符使null检查更简单:
Click?.Invoke(this,args)
using ( new EventGuard<EventArgs>( Proxy.RetrieveCompleted, new  EventHandler<EventArgs>( HandleRetrieveCompleted) ) )
{
    ManualResetEvent resetEvent = new ManualResetEvent();
    Proxy.RetrieveAsync(resetEvent);
    resetEvent.WaitOne();

}
new Receiver(handler => button.Click += handler, ...)
using (new EventGuard<EventArgs>(h => Proxy.RetrieveCompleted += h, 
          h => Proxy.RetrieveCompleted -= h,
          HandleRetrieveCompleted))
{
    ...
}