从F#中消耗C#事件

时间:2016-06-24 08:59:23

标签: c# events f#

关注Functional Reactive Programming教程,其中事件流(Observable)直接从System.Timers.Timer.Elapsed事件创建。

 let timer = new System.Timers.Timer(float 1)
 let observable = timer.Elapsed  
 observable 
 |> Observable.subscribe ...

class

中定义了C#
public delegate void OnMessageDelegate(Message message);

public class Notifier : INotifier
{
   public event OnMessageDelegate OnMessage;

   public void Notify(Message message) 
   => OnMessage?.Invoke(message);
}

将相应的Dll引用到F#项目并尝试从Observable事件中创建Notifier.OnMessage

 let Start (notifier : Namespace.Notifier)  = 
    notifier.OnMessage      
    |> Observable.subscribe (fun ms -> ...
    0

收到错误消息

  

事件'OnMessage'具有非标准类型。如果此事件以另一种CLI语言声明,则可能需要使用事件的显式add_OnMessage和remove_OnMessage方法来访问此事件。如果在F#中声明此事件,则使事件的类型为'IDelegateEvent< >'的实例化或'IEvent< ,_>'。

消息是自我描述的,我认为我的目标是从事件创建流而不是通过add_OnMessage方法订阅它。

1 个答案:

答案 0 :(得分:5)

看来F#期望事件的委托类型为System.EventHandlerSystem.EventHandler<'TEventArgs>的特化。

尝试将OnMessage的类型从OnMessageDelegate更改为EventHandler<Message>