Реализация C # EventHandlers в F # - PullRequest
7 голосов
/ 15 июля 2010

У меня есть интерфейс, написанный на C #, который определяется следующим образом:

public interface IWidget
{
    object Evaluate();
    event EventHandler Invalidated;
}

Когда я пытаюсь реализовать этот интерфейс в F #, я смотрю на то, что F # думает, что интерфейс IWidget (при наведении мышинад ним), и я вижу

type IWidget = 
    interface
        member Evaluate : unit -> obj
    end

Кажется, что оно полностью игнорирует событие Invalidated ... это известная проблема с F #, и если да, то есть ли способ обойти это?При реализации моей версии FW IWidget, я могу просто реализовать это событие вне раздела IWidget или как?Кажется очень неприятным, что f # так плохо обрабатывает ключевое слово "event" ...

ОБНОВЛЕНИЕ: После дальнейших разборок студия потом говорила что-то вроде:

'Реализация для IWidget не была предоставлена.remove_Invalidate (значение: EventHandler): unit '

затем, когда я добавил эти методы, чтобы все выглядело так:

interface IWidget with
    member w.Evaluate() = new obj()
    member w.add_Invalidated(value:EventHandler) = ()
    member w.remove_Invalidated(value:EventHandler) = ()
end

он скомпилировался нормально, хотя подсказка все еще говорилаединственным членом IWidget был Evaluate () ... похоже, что способ F # (или, по крайней мере, IDE) обрабатывает этот материал, действительно чокнутый ...

ДРУГОЕ ОБНОВЛЕНИЕ: согласно подсказке в IDEтег [] позволяет скомпилировать событие как событие метаданных CLI, преобразовав его в пару методов add_ / remove_ ... просто для справки для всех, кого это так же смутило, как и меня.Короче говоря, либо реализация этих двух методов, либо использование этого тега работают нормально, хотя тот факт, что в представлении всплывающей подсказки интерфейса IWdiget отсутствует упоминание о событии Invalidate, и необходимость реализации такого события замечена только тогда, когда компилятор выдаетошибка, все еще явная ошибка и довольно запутанная.Для любого любопытного, следующий код работает отлично:

let invalidated = new DelegateEvent<System.EventHandler>()

interface IWidget with
    member w.Evaluate() = new obj()
    [<CLIEvent>]
    member w.Invalidated = invalidated.Publish
end

Спасибо за помощь всем!

1 Ответ

9 голосов
/ 15 июля 2010

F # поддерживает события .

Например:

let invalidated = new DelegateEvent<System.EventHandler>()

[<CLIEvent>]
member this.Invalidated = invalidated.Publish
...