我正在尝试为创建生成的类型的Excel文件实现类型提供程序。我的目标是能够从C#中引用这些类型。
如果我使用擦除类型创建类型提供程序,我可以使用以下语法从F#引用它:
type DataTypesTest = ExcelFile<"tests\ExcelProvider.Tests\DataTypes.xlsx">
如果我将我的类型标记为已生成。上面的语法产生了这个错误:
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.
如何在F#代码中引用参数化生成的类型?此类型提供程序的源代码位于GitHub
答案 0 :(得分:2)
我认为问题可能是由于您在类型提供程序中构建类型的方式,而不是您在使用网站上的代码。对于生成或擦除类型的提供程序,使用类型提供程序的代码应该相同。尝试使用生成的类型提供程序使类型构造正确时,我发生了类似的错误。
在您的情况下,您的类型派生自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)
请注意,所有构造函数都需要进行此类更改。