2016-05-09 23 views
2

如何獲取給定字符串參數的屬性值。如何根據參數讀取屬性值

我有一個對象CsvProvider.Row它有屬性a,b,c。 我想獲取屬性值取決於作爲字符串參數給定的屬性。 我想是這樣的:

let getValue (tuple, name: string) = 
    snd tuple |> Seq.averageBy (fun (y: CsvProvider<"s.csv">.Row) -> y.```name```) 

,但它給了我下面的錯誤:

Unexpected reserved keyword in lambda expression. Expected incomplete structured construct at or before this point or other token.

的功能簡單的調用應該是這樣的:

getValue(tuple, "a") 

,它應該是相當於以下功能:

let getValue (tuple) = 
     snd tuple |> Seq.averageBy (fun (y: CsvProvider<"s.csv">.Row) -> y.a) 

這樣的事情甚至可能嗎?

感謝您的幫助!

+4

你需要反思 - 但爲什麼你不使用getter而不是名字? 'let getValue(ts,getter:CsvProvider <"s.csv"> .Row - >'a)= ...' – Carsten

+0

@Carsten yup我可以,但我想我可以這樣做,因爲對我來說它看起來會更好。 所以我想,像你建議我應該寫東西,或 讓的getValue(元組,名稱:字符串)= SND元組|> Seq.averageBy(樂趣Ÿ - > typedefof .Row> .GetField(名稱)。 GetValue():?> float) – MNie

+0

這取決於你,但給出選擇*我不會使用魔術字符串或反射時,我可以有編譯器檢查表達式 – Carsten

回答

2

如果您以靜態方式按列名訪問數據,則CSV類型提供程序非常好,因爲您可以通過類型推斷和檢查獲得很好的自動完成功能。

然而,對於一個動態的訪問,可能更容易直接使用底層CsvFile(也是F#數據的一部分),而不是使用類提供商:

// Read the given file 
let file = CsvFile.Load("c:/test.csv") 

// Look at the parsed headers and find the index of column "A" 
let aIdx = file.Headers.Value |> Seq.findIndex (fun k -> k = "A") 

// Iterate over rows and print A values 
for r in file.Rows do 
    printfn "%A" (r.Item(aIdx)) 

唯一可惜的是,這些項目是通過索引訪問的,所以如果你想通過他們的名字輕鬆訪問它們,你需要建立一些查找表。

+0

感謝您的答案。是的,這似乎是一個小問題,如果我使用CsvFile,要獲取屬性,我必須使用索引..我認爲CSVProvider也直接提供了這樣的功能,但它似乎不(現在還沒有)。雖然你的答案'回答'我的問題,所以我會接受它。非常感謝! – MNie