在F#中实现C#EventHandlers

时间:2010-07-15 00:27:17

标签: c# events f# interop

我有一个用C#编写的接口,定义如下:

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

当我尝试在F#中实现此接口时,我会看看F#认为IWidget接口是什么(通过将鼠标悬停在它上面),我看到了

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

它似乎完全忽略了Invalidated事件......这是F#的一个已知问题,如果是这样有什么方法可以解决它?在实现我的F#版本的IWidget时,我可以在IWidget部分之外实现此事件或者什么?似乎非常讨厌f#处理“event”关键字这么差......

更新: 在进一步摆弄之后,工作室随后说了些什么:

'没有给出IWidget.remove_Invalidate(value: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_方法......对于那些因为我而感到困惑的人来说,仅限FYI是。简而言之,实现这两个方法或使用该标记工作正常,尽管IWdiget接口的工具提示视图没有提及Invalidate事件,并且只有在编译器抛出时才会注意到实现此类事件的必要性。错误,仍然是一个明显的错误,并且非常令人困惑。对于任何好奇的人,以下代码都可以正常工作:

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

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

感谢所有人的帮助!

1 个答案:

答案 0 :(得分:8)

F# does support events

例如:

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

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