2011-03-16 31 views
1

我試圖用位置參數在F#中創建一個屬性,但一直失敗。屬性中的F#位置參數

type ColumnAttribute(?index:int,?name:string) = 
    inherit Attribute() 
    let mutable index = index 
    let mutable name = name 
    member x.Index 
     with get() = index 
     and set value = index <- value 
     member x.Name 
     with get() = name 
     and set value = name <- value 

type Substance = { 
    [<Column(Index=1)>] Name : string 
    [<Column(Index=0)>] Id : int 
    [<Column(Name="sequence")>] Sequence : string 
} 

我試過幾種不同的方法,但這是最接近我結束了。

回答

3

有2個問題,我用你的代碼

  1. 看到爲了這個工作,你需要定義一個無參數的構造函數ColumnAttribute
  2. 類型的IndexNameint optionstring option分別,但你需要它intstring

請嘗試以下

type ColumnAttribute(index:int option,name:string option) =  
    inherit Attribute()  
    let mutable index = index 
    let mutable name = name 
    new() = ColumnAttribute (None, None) 
    member x.Index   
     with get() = match index with | Some i -> i | None -> 0 
     and set value = index <- Some value   
    member x.Name   
     with get() = match name with | Some n -> n | None -> "" 
     and set value = name <- Some value 

type Substance = {  
    [<Column(Index=1)>] Name : string  
    [<Column(Index=0)>] Id : int  
    [<Column(Name="sequence")>] Sequence : string } 
+0

這也不起作用。這個szenario真的在fsharp中工作嗎?嗯。這真的很奇怪。我真正想要的是具有選項的屬性。所以我想我必須創建一個可爲空(或使用僞空值,例如對於索引-1和用於命名EmptyString)。我的意圖是使用這兩個屬性作爲選項索引或名稱來識別csv文件中的列 – 2011-03-16 20:42:47

+0

@Rainer,我不確定您的意思是「這不起作用」。我已經在Visual Studio 2010 RTM – JaredPar 2011-03-16 22:04:09

+0

中成功編譯過了。在一個乾淨的腳本中再次嘗試。現在它工作!我認爲它是我如何使用屬性的問題。我真的好奇爲什麼這不起作用。我知道你對fsharp有很好的瞭解。猜猜這是與我如何使用該屬性有關的錯誤。將再次檢查我的代碼庫! – 2011-03-17 09:35:43

2

這工作:

type ColumnAttribute() = 
    inherit System.Attribute() 
    let mutable index = 0 
    let mutable name = "" 
    member x.Index 
     with get() = index 
     and set value = index <- value 
    member x.Name 
     with get() = name 
     and set value = name <- value 

type Substance = { 
    [<Column(Index=1)>] Name : string 
    [<Column(Index=0)>] Id : int 
    [<Column(Name="sequence")>] Sequence : string 
} 

屬性已經支持類似命名的參數屬性setter語法。爲了得到你想要的,使用一個無參數的構造函數並且依賴於屬性語法,而不是命名參數(這對於屬性來說並不是很好,因爲它們被推斷爲option ......這不符合常量表達式)。

+0

我USEE讓可變指數= -1,因爲列可以是基於0的,而且我也必須有索引和列之間的選項。那麼對於一個屬性是否可以進行空的處理呢,或者這是對它的方式。 MSDN對此聲明不太清楚,因爲他們建議使用位置參數和屬性getter/setter方法。無論如何。這工作。我非常熱衷於使用我忘記了簡單方法的選項。 – 2011-03-16 20:58:35

+0

@Rainer - 你遇到了CLR限制。在元數據中表示時,屬性的構造函數參數(和字段/屬性設置器)只能包含類型System.Type,string,char,bool,float,float32,類型,枚舉或這些類型的數組。由於沒有辦法在屬性元數據中存儲'string option'或'int option'類型的值,所以必須使用類似Daniel的方法。 – kvb 2011-03-16 22:13:31

0

在這裏你去:

open System 

type ColumnAttribute() = 
    inherit Attribute() 
    let mutable index = 0 
    let mutable name = "" 
    member x.Index   
     with get() = index   
     and set value = index <- value   
    member x.Name   
     with get() = name   
     and set value = name <- value 

type Substance = {  
    [<Column(Index=1)>] Name : string  
    [<Column(Index=0)>] Id : int  
    [<Column(Name="sequence")>] Sequence : string 
} 

注意,可選參數(例如?index)在原來的嘗試都導致類型是如int option而不是int