我想做以下事情:
let allTypes = AllTypes (t, assemblies)
...其中AllTypes
是一个类型提供者,其属性是给定的类型为t
的子程序集的所有类型的实例。 (所有类型都有一个不带参数的构造函数。)
这是否可以使用F#类型提供程序?我没有创建自己的提供者的经验,如果不可行,我不想浪费时间尝试这样做。
我非常感谢能够让我开始编码的网页链接。
答案 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上发布。