2013-07-15 63 views
1

對不起,如果這是基本的,但我仍然圍繞F#包裝頭。訪問F#構造函數中的屬性值

我想這樣做:

type Person(user:User) as this = 
    member val Name = "" with get, set 
    user.UserId <- this.Name 

但是,這給我的錯誤Unexpected identifier in member definition

這編譯:

type Person(user:User) as this = 
    do 
     user.UserId <- this.Name 
    member val Name = "" with get, set 

但給了我一個InvalidOperationException在運行時。

我解決這個:

type Person(user:User) = 
    member val Name = "" with get, set 

    member this.Setup() = 
     user.UserId <- this.Name 

,但我不喜歡每次打電話person.Setup()

什麼是最好的F-Sharpy方式來做到這一點?

回答

4

您可以用顯式的構造函數來強制代碼初始化成員函數這樣做是爲了在您的其他代碼之前運行如下

type User() = 
    member val UserId = "" with get,set 
type Person private() = 
    member val Name = "" with get, set 
    new (user:User) as this = 
     Person() 
     then user.UserId <- this.Name 

這是由於初始化代碼在運行的事實構造函數,所以你必須強制它在完成屬性之前運行完成

+0

有沒有辦法做到這一點,只允許調用第二個構造函數(傳入User對象)?也就是說,使第一個(顯式)構造函數成爲私有的方法? –

+0

@KenSmith - 這是可能的 - 查看更新回答 –

+0

謝謝!讚賞。 –

相關問題