【问题标题】:Can F# interactive help me find the exported types of a TypeProvider?F# interactive 可以帮我找到 TypeProvider 的导出类型吗?
【发布时间】:2014-10-07 10:17:31
【问题描述】:

我只关注了tutorial 的第 1 部分。尽管我能够让前半部分在 F# 交互中工作。我真的很想获得简单的 json 提供程序类型。

我正在右键单击程序集,将输出发送到 F# 交互式,然后 open BTypeProvider.TypeProvider.Provided;; 工作正常。第一个 (MyType) 类型仍然可以正常生成。但由于示例教程在调用let inputs = ProvidedTypeDefinition("Inputs", Some typeof<obj>) 时似乎没有使用命名空间或程序集,我似乎无法从教程第一部分的第二部分找到任何生成的类型。

我很想知道如何反映导出的类型以找到它们。 Here's the code I'm running.

【问题讨论】:

  • 如果不点击链接可能会不清楚,我正在编写自己的类型提供程序,而不是使用已经编写的类型提供程序。

标签: f# type-providers


【解决方案1】:

几点可能会有所帮助!

如教程中所述,可以在 GitHub 上找到教程中代码的完整工作副本。相当不清楚的是,目前的代码会尝试load a json file from a hard coded location,因此除非您将内容与博客文章中显示的内容相似的 JSON 文件放入该位置,否则不会发生太多事情。我会尽快更新教程以使其更清晰。

类型导出到is set in the provider的命名空间,在本例中为“Mavnn.Blog.TypeProvider.Provided”。

希望这将使您能够让示例提供程序在 FSI 中成功运行 - 如果您仍然有问题,我建议您在 Visual Studio 中尝试它,因为在尝试加载 NewtonSoft.Json 时可能会出现程序集加载问题。

关于反思类型的最后一点,恐怕你有点不走运。大多数类型提供程序,包括本教程中的提供程序,都会生成“已擦除”类型;这些类型可用于在编译过程中引用 F# 项目,但在运行时不可用于反射或其他 CLR 语言。如果这些属性中的任何一个对您很重要,您将需要对生成类型提供程序进行一些研究,这些提供程序实际上会创建“真实”的 .net 对象。我知道,如果您正在生成大型类型系统,则会对性能产生一些影响。

【讨论】:

  • 感谢您的回复,我已经将您的 json 文件复制到我的项目中,现在尝试打开第二个 Visual Studio 实例来引用它。但是我收到一个错误Error 1 The type provider 'BTypeProvider.TypeProvider+JsonProvider' reported an error: The type provider constructor has thrown an exception: container type for 'BTypeProvider.TypeProvider.Provided.Inputs' was already set to 'BTypeProvider.TypeProvider.Provided.Simple' C:\projects\FSharpTypeProviders\BTypeProvider.Tester\Program.fs 1 1 BTypeProvider.Tester
【解决方案2】:

不确定是否可能是您想要的。 我通常会在主编辑器窗口中编译一次。
这使 Intellisense 在主窗口中工作。
然后您可以使用主窗口中的“交互式执行”来运行您想要的。
这不是您想要的,但我认为它应该对您有所帮助。

【讨论】:

  • 在主编辑器窗口中编译一次,你的意思是在 Visual Studio 中编译程序集? 这使 Intellisense 在主窗口中工作。 - 我很确定您在定义类型提供程序的程序集中针对类型提供程序提供的类型获得零智能感知。那是对的吗? 交互式执行似乎只有在其他两个与我理解的不同时才相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
相关资源
最近更新 更多