Если вы контролируете как C #, так и F # часть кода, то я не буду пытаться создавать функции F # явно из C # - это просто сделает ваш код C # уродливым. Вы можете легко добавить статический метод, который будет принимать Func
и Action
делегатов и предоставлять дружественный C # интерфейс:
type DelegateCommand (action:(obj -> unit), canExecute:(obj -> bool)) =
let event = new DelegateEvent<EventHandler>()
interface ICommand with
[<CLIEvent>]
member this.CanExecuteChanged = event.Publish
member this.CanExecute arg = canExecute(arg)
member this.Execute arg = action(arg)
static member Create(action:Action<obj>, canExecute:Func<obj, bool>) =
DelegateCommand(action.Invoke, canExecute.Invoke)
Теперь вы можете использовать DelegateCommand.Create
из C # приятным способом:
DelegateCommand.Create(
(o => Console.WriteLine(o)),
(o => true) )
Для записи, я также не совсем вижу значение определения DelegateCommand
в F # и использования его из C #, если вы ничего не делаете на стороне F # - это кажется простым типом, который также может быть определено в C # (т.е. вы не получаете много, делая это в F #).