简体   繁体   English

从F#中消耗C#事件

[英]Consume C# event from F#

Followed Functional Reactive Programming tutorial, where stream of events ( Observable ) is directly created from System.Timers.Timer.Elapsed event. 接下来的功能反应式编程教程,其中直接从System.Timers.Timer.Elapsed事件创建事件流( Observable )。

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

Have class defined in C# 在C#中定义class

public delegate void OnMessageDelegate(Message message);

public class Notifier : INotifier
{
   public event OnMessageDelegate OnMessage;

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

Referenced corresponding .dll into F# project and trying to create Observable from Notifier.OnMessage event 将相应的.dll引用到F#项目中并尝试从Notifier.OnMessage事件创建Observable

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

Getting error message 获取错误消息

The event OnMessage has a non-standard type. OnMessage事件具有非标准类型。 If this event is declared in another CLI language, you may need to access this event using the explicit add_OnMessage and remove_OnMessage methods for the event. 如果此事件以另一种CLI语言声明,则可能需要使用事件的显式add_OnMessageremove_OnMessage方法来访问此事件。 If this event is declared in F#, make the type of the event an instantiation of either IDelegateEvent<_> or IEvent<_,_> . 如果在F#中声明此事件,则使事件的类型为IDelegateEvent<_>IEvent<_,_>的实例化。

The error message is self descriptive, though I aim to create stream from event and not to subscribe on it via add_OnMessage method. 错误消息是自描述的,但我的目标是从事件创建流,而不是通过add_OnMessage方法订阅它。

It appears that F# expects the delegate type for events to be System.EventHandler or a specialization of System.EventHandler<'TEventArgs> . 似乎F#期望事件的委托类型是System.EventHandlerSystem.EventHandler<'TEventArgs>

Try changing the type of OnMessage from OnMessageDelegate to EventHandler<Message> . 尝试将OnMessage的类型从OnMessageDelegate更改为EventHandler<Message>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM