在类型提供者中使用反射来模仿 RFC FS-1023

Using reflection in type providers to mimic RFC FS-1023

据我了解,只有原始类型可以作为参数提供给类型提供程序,因此您不能执行 TypeProvider<Option<int>> 之类的操作,但可以执行 TypeProvider<"Option<int>">。有什么方法可以使用反射来模仿前者和后者吗?

我们的想法是能够以某种方式进行类型化以生成基于它们的新类型。例如,复制类型的简单 TypeProvider 可能会这样做:

type Foo = {Str : string}
type Bar = TypeProvider<Foo>
// Bar.Foo is a string

这不可能以任何明智的方式完成。

主要问题是Foo类型在实例化类型提供者时尚未编译,因此您无法通过反射访问它。

类型提供程序可以通过多种有趣的方式被滥用。如果您想查看其中的大部分内容,Mixin type provider 可能是最具冒险精神的示例 - 但我不确定它是否有办法满足您的要求。

也就是说,没有什么能阻止 Crazy<"Foo"> 等类型提供程序查看磁盘并尝试在 F# 源代码中的某处找到 Foo 的类型定义。我想这可能会奏效。需要注意的是,您只能获得源代码 - 因此您必须自己解析并自行提取类型定义。