我想要声明的 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/