2011-02-11 30 views
9

tôi phơi bày một sự kiện từ F # C# như thế này:C# sự kiện kiểu phụ kiện cho sự kiện CLI trong F #

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

Nhưng tôi muốn một số mã để chạy bất cứ khi nào xử lý được thêm vào hoặc gỡ bỏ. Tôi nghĩ rằng điều này có thể được thực hiện trong C# như sau:

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

Làm cách nào để viết nội dung trên trong F #?

Trả lời

11

Trong F #, bạn có thể xác định sự kiện có triển khai giao diện IDelegateEvent<_> (hoặc giao diện IEvent<_> hoặc IEvent<_,_> xuất phát từ giao diện đó). Vì vậy, bạn có thể làm một cái gì đó như thế này:

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 
+2

Tôi nghĩ rằng 'mới tổ chức sự kiện <'a>() 'trên dòng đầu tiên là không cần thiết. Bạn có muốn viết chỉ {{new IEvent <'a> with ...} '? Vì nó, nó tạo ra một sự thực thi 'IEvent' cũng thừa hưởng' Event', nhưng lớp cơ sở không được sử dụng cho bất cứ thứ gì (và không cần thiết). –

+1

@Tomas - bạn hoàn toàn đúng. Tôi sẽ chỉnh sửa câu trả lời của mình. – kvb

+0

Làm việc như một sự quyến rũ. Cảm ơn bạn! – petebu

2

Bạn cũng có thể bọc một sự kiện nếu bạn muốn kích hoạt.

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" 

đầu ra

1 first 
2 second 
-2 second- 
Các vấn đề liên quan