如何引用TypeProvider创建的“生成”类型

时间:2014-03-19 23:26:39

标签: f# type-providers

我正在尝试为创建生成的类型的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

1 个答案:

答案 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)

请注意,所有构造函数都需要进行此类更改。