2014-10-10 119 views
2

我想做到以下幾點:使用F#類型提供實例類型,並提供它們的屬性

let allTypes = AllTypes (t, assemblies)

...其中AllTypes是一種類型的供應商,其性質是實例類型爲t的子類的給定數組中的所有類型。 (所有類型都有一個不帶參數的構造函數。)

這是可以使用F#類型提供程序嗎?我沒有創建自己的提供者的經驗,如果不可行,我不想浪費我的時間來嘗試這樣做。

我非常感謝任何鏈接到頁面,讓我開始編碼。

回答

2

FSharp.Data github回購中有很多活動正在進行。有一條學習曲線,但調整到回購可能是有用的。

除此之外,這個介紹tutorial涵蓋了一些基本知識,這裏有一個由F#開源社區準備的Type Provider starter pack

fsharp.org網站和此projects page涵蓋了正在發生的事情(包括類型提供程序)的橫截面。

你可以把馬克在這裏建議的列表中,並把它變成一個類型的提供者。我認爲與命名空間交互的一種探索性方式將會很有用。爲什麼不?我會用它。如果你接近它,請在GitHub上發佈。

2

你不需要類型提供者;您可以使用基本反映編寫代碼:

open System.Reflection 

let allTypes (baseClass : Type) (assemblies : Assembly seq) = 
    assemblies 
    |> Seq.collect (fun x -> x.GetExportedTypes()) 
    |> Seq.filter (fun x -> baseClass.IsAssignableFrom x) 
    |> Seq.collect (fun x -> x.GetConstructors()) 
    |> Seq.filter (fun x -> x.GetParameters().Length = 0) 
    |> Seq.map (fun x -> x.Invoke([||])) 

allTypes功能有這樣的簽名:Type -> Assembly seq -> obj seq

+0

是的,我可以做這樣的事情(事實上,我已經寫了這部分代碼)。 事情是,我希望類型被暴露爲*屬性*,以利用這些值的編譯時解析。 (無需施放它們,智能感知彈出窗口等) – MiloDC 2014-10-10 23:40:22

+0

*屬性*是什麼意思? – 2014-10-11 03:50:40

+0

C#屬性:http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx – MiloDC 2014-10-11 19:58:59