events - F# 中无需装箱的多参数事件类型

标签 events f# delegates clr c#-to-f#

我想要声明的 C# 等价物很简单:

public event Action<DateTime, int> example;

我希望通过 C# 订阅此事件,如下所示:

example += DoSomething;

private static void DoSomething(DateTime time, int count)
{
    Console.WriteLine("Time: {0} Count:{1}", time, count);
}

我可以使用 DelegateEvent( see this question ),但我的理解是 DelegateEvent.Trigger将导致值装箱,因为它们作为对象数组传入。

如何在 F# 中不装箱定义多个参数的事件?

最佳答案

DelegateEvent 的具体实现确实将参数装箱到 obj[] 中,但您可以创建自己的 IDelegateEvent 类型:

type T() =
    let handlers = ResizeArray<System.Action<System.DateTime,bool>>()
    let event = { new IDelegateEvent<_> with
                        member __.AddHandler(h) = handlers.Add h 
                        member __.RemoveHandler(h) = handlers.Remove h |> ignore }
    [<CLIEvent>]
    member x.example = event
    member x.Trigger(dt,i) =
        for handler in handlers do
            handler.Invoke(dt,i)

如果这是您经常做的事情,那么您可以将逻辑封装到其自己的 CustomEvent 类型中,而不是将其传播到包含事件的类型中。

关于events - F# 中无需装箱的多参数事件类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31611910/

相关文章:

java - 在 Java Applet 上捕获 WACOM 平板电脑事件

c# - 编写事件访问器时的多线程问题

f# - 如何获取接口(interface)实例方法的 F# 引用?

f# - 在 F# 中,流水线意味着什么?

iPhone:如何关闭 MFMailComposeViewController?

ios - Objective C 中的 Nil 委托(delegate)

java - 我不明白 consume() 做什么

java - 组件未按预期添加到框架中

while-loop - F# 中具有不可变值的 While 循环

javascript - 无法正确委派幻灯片放映