2017-02-18 20 views
1

如何在C#中聲明和初始化F#中定義的歧視聯盟值?如何在C#中聲明並初始化F#中定義的歧視聯盟值?

F#代碼:

namespace Core 

[<AutoOpen>] 
module EventStore = 

    type Events = 
     | BuyRequested of RequestInfo 
     | SellRequested of RequestInfo 

RequestInfo被定義爲以下:

namespace Core 

[<AutoOpen>] 
module Entities = 
    type RequestInfo = { 
     AccountId : string 
     Symbol : string 
     Quantity : int 
    } 

C#客戶:

var myEvent = new Events.NewBuyRequested(requestInfo); // Doesn't compile 

我試圖引用此link,這樣我可以參考下面的例子:

type Shape = 
| Circle of float 
| Rectangle of float * float 

C#:

var circle = Shape.NewCircle(23.77); 
var rectangle = Shape.NewRectangle(1.5, 2.2); 

但是我沒有看到暴露我的DU情況下的值的任何方法(即BuyRequested,SellRequested)。

+5

從「new Events.NewBuyRequested」中刪除新的。它現在有效。 –

回答

1

正如您已經發現的那樣,New...方法不是構造函數,而是靜態方法。爲了完整起見,我想補充以下內容:

  • 對於所有工會的情況下有參數,F#編譯器生成的名字"New"的靜態方法加上工會例的名稱。
  • 對於所有沒有參數的聯合事例,會生成一個靜態只讀屬性,它與聯合事件案例名稱相同。

例如,在這個聯盟,

type U = 
    | U1 
    | U2 of int 

你:

> let members = typeof<U>.GetMembers();; 
val members : System.Reflection.MemberInfo [] = 
    [|U get_U1(); Boolean get_IsU1(); U NewU2(Int32); Boolean get_IsU2(); 
    Int32 get_Tag(); Int32 CompareTo(U); Int32 CompareTo(System.Object); 
... 

個別情況是:

> typeof<U>.GetMember("get_U1");; 
val it : System.Reflection.MemberInfo [] = 
    [|U get_U1() 
     {Attributes = PrivateScope, Public, Static; 
     CallingConvention = Standard; 
     ContainsGenericParameters = false; 
     CustomAttributes = seq [[Microsoft.FSharp.Core.CompilationMappingAttribute((Microsoft.FSharp.Core.SourceConstructFlags)8, (Int32)0)]]; 
... 
> typeof<U>.GetMember("NewU2");; 
val it : System.Reflection.MemberInfo [] = 
    [|U NewU2(Int32) 
     {Attributes = PrivateScope, Public, Static; 
     CallingConvention = Standard; 
     ContainsGenericParameters = false; 
     CustomAttributes = seq [[Microsoft.FSharp.Core.CompilationMappingAttribute((Microsoft.FSharp.Core.SourceConstructFlags)8, (Int32)1)]]; 

CompilationMappingAttribute是識別他們的一個如來自工會案例,幷包含wh的順序他們被定義了。