给定

open System
open System.Windows
open System.Windows.Input
open System.ComponentModel

type RelayCommand (canExecute:(obj -> bool), action:(obj -> unit)) =
    let event = new DelegateEvent<EventHandler>()
    interface ICommand with
        [<CLIEvent>]
        member x.CanExecuteChanged = event.Publish
        member x.CanExecute arg = canExecute(arg)
        member x.Execute arg = action(arg)
    member x.CheckCanExecute (sender:obj) (eventArgs:EventArgs) = event.Trigger([| sender;eventArgs  |])

如何编写可以满足CheckCanExecute调用的静态解析类型参数化函数?

虽然此功能有效,但并不能帮助我学习静态解析的类型参数语法
let checkCanExecute (c:RelayCommand) = c.CheckCanExecute (box this) (EventArgs())
我希望这可以工作
let checkCanExecute (e:^a) = (^a: (member CheckCanExecute: sender:obj -> EventArgs -> unit ) (e, (box me),(EventArgs())))
但在 call 现场checkCanExecute addCommand
我找不到方法或对象构造函数“CheckCanExecute”(使用第二个定义时,第一个编译就很好了)

如何定义使用Statically Resolved Type Parameters的类let绑定(bind)(如果可以更好地完成工作,则使用成员绑定(bind)),以便能够在具有匹配方法签名的任何对象上调用该方法?

最佳答案

我认为这里的一些困难是由于CheckCanExecute被定义为咖喱函数而引起的。对于成员而言,最好使用元组函数(咖喱函数的编译方式比较棘手,并且可能使静态解析约束变得混乱)。

如果您按以下方式更改RelayCommand成员:

 member x.CheckCanExecute (sender:obj, eventArgs:EventArgs) =
   event.Trigger([| sender;eventArgs  |])

并将checkCanExecute设为需要tupled函数的inline函数:
let inline checkCanExecute (e:^a) =
  (^a: (member CheckCanExecute: obj * EventArgs -> unit ) (e, box me,(EventArgs())))

然后,以下类型检查:
checkCanExecute me

08-04 18:13