2013-06-18 81 views
4

我想從這篇文章http://www.codeproject.com/Articles/35532/C-COM-Object-for-Use-In-JavaScript-HTML-Including什麼是F#相當於C#「公共事件」

我已經在這個線絆倒轉換爲F#代碼:

public delegate void MyFirstEventHandler(string args); 
public event MyFirstEventHandler MyFirstEvent; 

我試着

type MyFirstEventHandler = delegate of string -> unit 
type MyFsComComponent() = 
    let my_event = new Event<MyFirstEventHandler,string>() 

    [<CLIEvent>] 
    member x.MyFirstEvent = my_event.Publish 

我也得到:在F#作爲翻譯這個'MyFirstEventHandler' 有一個非標準的代表

我可以編譯:

type MyFirstEventHandler = delegate of obj*string -> unit 

但是,這是不是有什麼需要COM控制。

這個問題也在C# to F# class transition提出 - 「公共事件」仍然沒有解決

解決。感謝葉花環

type MyFirstEventHandler = delegate of string -> unit 
type MyFsComComponent() =  
    let my_event = new DelegateEvent<MyFirstEventHandler>() 

    [<CLIEvent>] 
    member x.MyFirstEvent = my_event.Publish 

有竅門。

+0

很高興爲你工作。您可以將我的答案標記爲接受以突出顯示它。 –

回答

5

F# Event類預計參數類型爲通用參數,而不是委託類型。它也希望代表是一個標準類型(例如類似obj*eventargs->unit)。對於任意委託使用DelegateEvent。

type MyFirstEventHandler = delegate of string -> unit 
type MyFsComComponent() = 
    let my_event = new DelegateEvent<MyFirstEventHandler>() 

    [<CLIEvent>] 
    member x.MyFirstEvent = my_event.Publish 
+0

我試過這個。 這是一個正確的CLIEvent,但它不完全等同於C#公共事件。 COM魔術[)>]不想將其作爲COM事件公開。 – Ingaz

+0

啊,對不起,我錯過了。你可以使用'DelegateEvent'來代替。我會更新答案。 –

+1

Leaf,DelegateEvent正是需要的。 – Ingaz