gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:58:46 29 4
gpt4 key购买 nike

我想将一个事件传递给一个方法。我的代码如下,但是我应该为“XXX”类型输入什么?

internal class Retriever<TEventArgs> where TEventArgs : EventArgs
{
public Retriever( XXX event, EventHandler<TEventArgs> handler )
{
_event = event;
_handler = handler;

_event += handler;
}

XXX _event;
EventHandler<TEventArgs> _handler;
}

编辑:问题的详细说明。我正在尝试编写一个通用事件守卫,在事件发生之前订阅事件,并在事件发生后取消订阅。这个类看起来像:

internal class EventGuard<TEventArgs> : IDisposable where TEventArgs : EventArgs 
{
public Retriever( XXX event, EventHandler<TEventArgs> handler )
{
_event = event;
_handler = handler;

_event += handler;
}

XXX _event;
EventHandler<TEventArgs> _handler;

public void Dispose()
{
_event -= _handler;
}
}

我会按以下方式使用它。 Proxy.RetrieveAsync 是一种 Web 方法,完成后会触发 Proxy.RetrieveCompleted 事件。未显示的完成处理程序 HandleRetrieveCompleted 的主体将调用 ManualResetEvent 上的 Set()(作为 UserState 对象传入)。

using ( new EventGuard<EventArgs>( Proxy.RetrieveCompleted, new  EventHandler<EventArgs>( HandleRetrieveCompleted) ) )
{
ManualResetEvent resetEvent = new ManualResetEvent();
Proxy.RetrieveAsync(resetEvent);
resetEvent.WaitOne();

}

最佳答案

你不需要 - 事件就像一个属性,它只是一对方法的语法糖(添加/删除而不是属性的获取/设置)。 F# 实际上确实 将事件公开为一等公民,但 C# 没有:(

虽然有几个选项:

  • 传入您使用要添加的新处理程序调用的“事件订阅者”委托(delegate)(也可能是事件取消订阅者委托(delegate))。像这样:

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

  • 研究 Reactive Extensions 框架,它有多种处理事件的方法(使用反射,但这意味着 Microsoft 代替你进行反射工作:)

如果我们了解大局,我们可以提供更好的建议 - 愿意告诉我们更多信息吗?

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

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

诚然,这非常令人讨厌。您可能会发现 Reactive Extensions 中有更好的东西,但这至少会起作用...

关于c# - 将事件作为参数传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2246437/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com