在f#中,我有以下代码
[<Literal>]
let fname=fstFile.FullName.ToString()
type genomeFile = CsvProvider<fname>
其中fstFile是FileInfo类的一个实例。但是,使用
就失败了:This is not a valid constant expression or custom attribute value
如果没有实际的硬编码字符串,我似乎无法创建类型。有人知道怎么解决这个问题吗?
CSV类型提供程序的参数需要是一个常量,以便可以在编译时生成类型(而无需实际计算程序)。但是,您可以在运行时用相同的模式加载不同的文件。
因此,处理这个问题的最好方法是将您的实际输入之一复制到某个众所周知的位置(例如,sample.csv
在与脚本相同的目录中),然后在运行时使用实际路径:
// Generate type based on a statically known sample file
type GenomeFile = CsvProvider<"sample.csv">
// Load the data from the actual input at runtime
let actualData = GenomeFile.Load(fstFile.FullName.ToString())
但是,如果您在已编译的DLL中引用文字,则可以工作。所以,例如,如果您将示例拆分为两个项目,
。用TypeProviderArgs创建一个新项目。fs ==> TypeProviderArgs.dll
module TypeProviderArgs
[<Literal>]
let fname=fstFile.FullName.ToString()
然后在你的程序中引用TypeProviderArgs.dll,它应该可以工作了
type genomeFile = CsvProvider<TypeProviderArgs.fname>
如果你必须为此目的创建一个库,这有点可怕,但如果你是在一个已经有库的大项目中,那就没那么糟糕了。
问题是[<Literal>]
只能应用于编译时已知的东西(例如"Hello"
)。
fstFile.FullName.ToString()
的结果只有在运行时才知道。