Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C#-style event accessors for CLI events in F#

I am exposing an event from F# to C# like this:

let event = new DelegateEvent<EventHandler>()
member x.Ping() = event.Trigger([| x; EventArgs.Empty |])
[<CLIEvent>]
member x.PingEvent = event.Publish

But I'd like some code to run whenever handlers are added or removed. I think this can be done in C# like this:

public event EventHandler PingEvent
{
    add 
    {
        //do something
    }
    remove
    {
        //do something
    }
}

How do I write the above in F#?

like image 323
petebu Avatar asked Feb 11 '11 00:02

petebu


1 Answers

In F#, you can define events with implementations of the IDelegateEvent<_> interface (or the IEvent<_> or IEvent<_,_> interfaces which derive from it). So you can do something like this:

let customEvent add remove =
  { new IDelegateEvent<_> with
        member this.AddHandler del = add del
        member this.RemoveHandler del = remove del }

type MyType() =
  let ev = customEvent (* your add handler *) (* your remove handler *)

  [<CLIEvent>]
  member this.myEvent = ev
like image 59
kvb Avatar answered Oct 21 '22 05:10

kvb