2

WPF コントロールには、同じインターフェイスまたは基本クラスを共有せずに同じ名前を持つ多くのイベント メンバーがあります。F# の型制約により、同じメンバーを持つすべてのオブジェクトに対して機能する関数を記述できます。次に、イベント メンバーの型制約を記述することができれば、多くのコントロールに対して同じ方法でプロパティ設定を容易にするカリー化された関数を記述することができます。

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 に答える