.net F中CLI事件的C#风格事件访问器#

.net F中CLI事件的C#风格事件访问器#,.net,events,f#,c#-to-f#,.net,Events,F#,C# To F#,我正在揭露一个从F到C的事件,就像这样: let event = new DelegateEvent<EventHandler>() member x.Ping() = event.Trigger([| x; EventArgs.Empty |]) [<CLIEvent>] member x.PingEvent = event.Publish public event EventHandler PingEvent { add { //d

我正在揭露一个从F到C的事件,就像这样:

let event = new DelegateEvent<EventHandler>()
member x.Ping() = event.Trigger([| x; EventArgs.Empty |])
[<CLIEvent>]
member x.PingEvent = event.Publish
public event EventHandler PingEvent
{
    add 
    {
        //do something
    }
    remove
    {
        //do something
    }
}
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
如何在F#中写入上述内容?

在F#中,您可以使用
IDelegateEvent
接口(或从其派生的
IEvent
IEvent
接口)的实现来定义事件。所以你可以这样做:

let event = new DelegateEvent<EventHandler>()
member x.Ping() = event.Trigger([| x; EventArgs.Empty |])
[<CLIEvent>]
member x.PingEvent = event.Publish
public event EventHandler PingEvent
{
    add 
    {
        //do something
    }
    remove
    {
        //do something
    }
}
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
让customEvent添加或删除=
{new IDelegateEvent with
成员this.AddHandler del=添加del
成员this.RemoveHandler del=remove del}
类型MyType()=
让ev=customEvent(*您的添加处理程序*)(*您的删除处理程序*)
[]
成员this.myEvent=ev

如果需要触发,也可以包装事件

type MonitoredEvent<'a>(add, remove) =
    inherit Event<'a>() 

    let bp = base.Publish
    let p = { new IEvent<'a> with 
                member this.AddHandler del = 
                    add()
                    bp.AddHandler del
                member this.RemoveHandler del = 
                    remove()
                    bp.RemoveHandler del
                member this.Subscribe o = 
                    failwith "Not implemented"
                }

    member this.Publish = p

type Something() =
    let mutable listeners = 0
    let add() = listeners <- listeners + 1
    let remove() = listeners <- listeners - 1
    let me = new MonitoredEvent<_>(add, remove)

    member this.Ping x = me.Trigger (sprintf "%d %s" listeners x)

    [<CLIEvent>]
    member this.PingEvent = me.Publish

let computer = new Something()
computer.PingEvent.Add(printfn "%s")
computer.Ping "first"
computer.PingEvent.Add(printfn "-%s-")
computer.Ping "second"

我认为,
新事件与…}?实际上,它创建了一个
IEvent
的实现,该实现也继承了
事件
,但基类不用于任何事情(也不应该是必需的)。工作起来很有魅力。非常感谢。