使用F#类型提供程序实例化类型并将其显示为属性

时间:2014-10-10 18:07:36

标签: f# type-providers

我想做以下事情:

let allTypes = AllTypes (t, assemblies)

...其中AllTypes是一个类型提供者,其属性是给定的类型为t的子程序集的所有类型的实例。 (所有类型都有一个不带参数的构造函数。)

这是否可以使用F#类型提供程序?我没有创建自己的提供者的经验,如果不可行,我不想浪费时间尝试这样做。

我非常感谢能够让我开始编码的网页链接。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

FSharp.Data github repo中有很多活动正在进行中。有一个学习曲线,但调整到该回购可能是有用的。

除此之外,本简介tutorial涵盖了一些基础知识,这里是由F#开源社区准备的Type Provider starter pack

fsharp.org网站,此projects page涵盖了正在发生的事情的横截面(包括类型提供商)。

您可以获取Mark在此建议的列表,并将其转换为类型提供程序。我认为与命名空间交互的探索方式会很有用。为什么不?我会用它。如果你接触它,请在GitHub上发布。