2

WPF 控件有许多事件成员,它们具有相同的名称,但不共享相同的接口或基类。F# 的类型约束支持编写函数,该函数适用于具有相同成员的所有对象。然后,如果我可以为事件成员编写类型约束,我可以编写 curried 函数,以方便许多控件的属性设置。

open System.Windows.Controls
let inline click handler control =
  (^T:(member Click:IEvent<_,_>)control)
    .Add handler

Button()
|> click (fun _ -> ()) // error!

MenuItem()
|> click (fun _ -> ()) // error!

type A () =
  [<CLIEvent>]
  member __.Click = Event<_>().Publish
A() |> click (fun _ -> ()) // It works! but IntelliSense shows the member as "event A.Click .."

但是上面的代码不起作用..我想为事件成员编写类型约束是不可能的..因为这是一个小问题,如果我们通过语言特性解决每一个小问题,语言将变得如此复杂以至于没有人可以使用!(现在 F# 似乎强大而简单)

然后我想知道一些解决这个问题的替代方法,如果它存在的话。

4

1 回答 1

1

发布这个问题后,我自己解决了这个问题。您可以通过调用方法 add_* 和 remove_* 来访问事件成员。类型约束适用于方法调用。谢谢!

let inline click handler control =
  let handler = RoutedEventHandler(fun _ e -> handler e)
  (^T:(member add_Click:RoutedEventHandler->unit)control,handler)

Button() |> click (fun _ -> ()) // works!
MenuItem() |> click (fun _ -> ()) // works!
于 2012-05-18T12:45:03.360 回答