说:
let x = // some operation
type t = SomeTypeProvider<x>
这个有效吗?
说:
let x = // some operation
type t = SomeTypeProvider<x>
这个有效吗?
编号.
由于类型必须在编译时生成,类型提供程序的参数需要是一个常量。
换句话说,你标记为// some operation
的代码可以计算为文字,但不能是可运行函数返回的值:
let arg = "foo"
type t = SomeTypeProvider<arg> // okay
let [<Literal>] arg = """{"name":"foo","value":42}"""
type t = SomeTypeProvider<arg> // okay
let arg = x.ToString()
type t = SomeTypeProvider<arg> // Boom! arg is not a Literal
这取决于您的应用程序,但最常见的情况之一如下:
您有一个与数据库相关的类型提供程序,并且需要在运行时从某种配置文件或其他地方检索连接字符串。因此,开发人员错误地认为他们需要一个可运行的代码来首先检索连接字符串,然后将其传递给类型提供程序。
正确的方法如下:
保留两个数据库:一个在常量位置本地存储(仅用于模式),另一个用于运行时目的。
将第一个(一个常量!)传递给您的类型提供程序。不要担心硬编码的路径;它仅用于模式检索。
// Use a fixed sample file for schema generation only
type MyCSVData = CsvProvider<"dummy.csv">
// Load the actual data at runtime
let data = MyCSVData.Load(RetrieveFileNameFromConfig())
type t = SomeTypeProvider<x>
。x
是常量,是的,你可以这样做。 - CaringDevx
不是一个常量,而是一个 ssh 客户端创建。 - Lay González