2011-02-11 17 views
9

में CLI घटनाओं के लिए शैली घटना accessors मैं इस तरह सी # करने के लिए एफ # से एक घटना को उजागर कर रहा हूँ:सी # एफ #

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 
    } 
} 

मैं उपरोक्त एफ # में कैसे लिखूं?

उत्तर

11

एफ # में, आप IDelegateEvent<_> इंटरफेस (या IEvent<_> या IEvent<_,_> इंटरफेस से प्राप्त होने वाले इंटरफेस के कार्यान्वयन के साथ ईवेंट को परिभाषित कर सकते हैं)। तो आप इस तरह कुछ कर सकते हैं:

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

मुझे लगता है कि 'नई घटना <'a>()' पहली पंक्ति पर अनावश्यक है। क्या आप सिर्फ '{नया आईवेन्ट <'a> ...} 'लिखना चाहते थे? जैसा कि है, यह 'आईवेन्ट 'का कार्यान्वयन करता है जो' इवेंट 'भी प्राप्त करता है, लेकिन आधार वर्ग का उपयोग किसी भी चीज़ के लिए नहीं किया जाता है (और इसकी आवश्यकता नहीं होनी चाहिए)। –

+1

@ टोमास - आप बिल्कुल सही हैं। मैं अपना जवाब संपादित करूंगा। – kvb

+0

एक आकर्षण की तरह काम किया। धन्यवाद! – petebu

2

यदि आप ट्रिगर करना चाहते हैं तो आप एक ईवेंट भी लपेट सकते हैं।

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" 

उत्पादन

1 first 
2 second 
-2 second-