.net F中CLI事件的C#风格事件访问器#
我正在揭露一个从F到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
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
的实现,该实现也继承了事件
,但基类不用于任何事情(也不应该是必需的)。工作起来很有魅力。非常感谢。