2014-10-10 122 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