event.create in f#?

时间:2014-12-23 16:35:53

标签: events f#

我正在尝试编译源代码:Custom WPF Controls in F#

这条线怎么样:

 let (handler, event) = Event.create<EventArgs>()

引发错误:

The value, constructor, namespace or type 'create' is not defined

MSDN's Control.Event Module (F#) page确实谈到了这样一个功能:

  

Event模块提供的附加功能是   这里说明。以下代码示例说明了基本用法    Event.create 创建一个事件和一个触发器方法,添加两个   事件处理程序以lambda表达式的形式,然后触发   执行两个lambda表达式的事件。

type MyType() =
   let myEvent = new Event<_>()

   member this.AddHandlers() =
      Event.add (fun string1 -> printfn "%s" string1) myEvent.Publish
      Event.add (fun string1 -> printfn "Given a value: %s" string1) myEvent.Publish

   member this.Trigger(message) =
      myEvent.Trigger(message)

let myMyType = MyType()
myMyType.AddHandlers()
myMyType.Trigger("Event occurred.")

但是请注意,它仅在说明中提及,而不是在示例中。

此外,Control.Event Module (F#) page没有提及此类create功能。

我想这可能是一个旧功能或其他东西,但我是F#的新手,所以我无法看到它应该替换为什么..

1 个答案:

答案 0 :(得分:8)

Event.create是一个相当古老的事件API,从F#2.0之前判断MSDN上的内容。它为您提供了触发器功能和已发布的事件 - 这两个事件现在都是Publish类的TriggerEvent成员。

因此,如果您想在“现代”术语中实现create,它可能看起来像这样:

module Event = 
    let create<'T> () = 
        let event = Event<'T>()
        event.Trigger, event.Publish

我不建议您普遍使用它,但也许这足以使旧代码恢复生机(这里正确的方法是重构它以使用PublishTrigger而不是{ {1}})。