F# 如何参考';生成';类型提供程序创建的类型

F# 如何参考';生成';类型提供程序创建的类型,f#,type-providers,F#,Type Providers,我正在尝试为Excel文件实现一个类型提供程序,用于创建生成的类型。我的目标是能够从C#中引用这些类型 如果我使用擦除的类型创建类型提供程序,我可以使用以下语法从F#引用它: type DataTypesTest = ExcelFile<"tests\ExcelProvider.Tests\DataTypes.xlsx"> type DataTypesTest=ExcelFile 如果我将我的类型标记为已生成。上述语法会产生此错误: A direct reference to t

我正在尝试为Excel文件实现一个类型提供程序,用于创建生成的类型。我的目标是能够从C#中引用这些类型

如果我使用擦除的类型创建类型提供程序,我可以使用以下语法从F#引用它:

type DataTypesTest = ExcelFile<"tests\ExcelProvider.Tests\DataTypes.xlsx">
type DataTypesTest=ExcelFile
如果我将我的类型标记为已生成。上述语法会产生此错误:

A direct reference to the generated type 'ExcelFile' is not permitted. Instead, use a type definition, e.g. 'type TypeAlias = <path>'. This indicates that a type provider adds generated types to your assembly.
不允许直接引用生成的类型“ExcelFile”。相反,请使用类型定义,例如“type TypeAlias=”。这表示类型提供程序将生成的类型添加到程序集中。

如何在F#代码中引用参数化生成的类型?此类型提供程序的源代码可在

上找到。我相信问题可能是由于您在类型提供程序中构造类型的方式,而不是您在使用站点上的代码。对于生成或擦除的类型提供程序,使用类型提供程序的代码应相同。我在尝试使用生成的类型提供程序正确地获取类型构造时也发生了类似的错误

在您的情况下,您的类型派生自
ExcelFileInternal
,因此您需要使用
BaseConstructorCall
,而不仅仅是构造函数逻辑。这应该类似于:

// add a parameterless constructor which loads the file that was used to define the schema
let ctor = ProvidedConstructor([])
ctor.BaseConstructorCall <- fun [] -> <@@ ExcelFileInternal(resolvedFilename, range) @@>
providedExcelFileType.AddMember(ctor)
//添加一个无参数构造函数,用于加载用于定义架构的文件
让ctor=ProvidedConstructor([])
构造函数调用
providedExcelFileType.AddMember(ctor)
请注意,所有构造函数都需要这种类型的更改