Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 我什么时候需要打电话给;“转换生成”;使用类型提供程序生成类型的成员_F#_Type Providers - Fatal编程技术网

F# 我什么时候需要打电话给;“转换生成”;使用类型提供程序生成类型的成员

F# 我什么时候需要打电话给;“转换生成”;使用类型提供程序生成类型的成员,f#,type-providers,F#,Type Providers,我很难破译文章的“提供生成的类型”部分。本教程提供了以下规范 “您还必须对根提供的类型调用ConvertToGenerated,该类型的嵌套类型构成生成的类型的封闭集。此调用将给定的提供类型定义及其嵌套类型定义发送到程序集中,并调整所有提供类型定义的程序集属性以返回该程序集。仅当第一次访问根类型上的assembly属性时,才会发出程序集。主机F#编译器在处理类型的生成类型声明时确实访问此属性。” 我不知道在哪里放置ConvertToGenerated调用,也不确定assembly file na

我很难破译文章的“提供生成的类型”部分。本教程提供了以下规范

“您还必须对根提供的类型调用ConvertToGenerated,该类型的嵌套类型构成生成的类型的封闭集。此调用将给定的提供类型定义及其嵌套类型定义发送到程序集中,并调整所有提供类型定义的程序集属性以返回该程序集。仅当第一次访问根类型上的assembly属性时,才会发出程序集。主机F#编译器在处理类型的生成类型声明时确实访问此属性。”

我不知道在哪里放置ConvertToGenerated调用,也不确定assembly file name参数的要求。有人能提供一个示例吗?谢谢。

在F#团队的帮助下,我解决了我的问题。这就是我所做的

namespace Types

open System
open System.Data
open System.IO
open System.Linq
open System.Data.Linq
open Microsoft.FSharp.Data.TypeProviders
open Microsoft.FSharp.Linq
open Microsoft.FSharp.TypeProvider.Emit
open Microsoft.FSharp.Core.CompilerServices

type DatabaseSchema = 
    SqlDataConnection<"Data Source=(local);Initial Catalog=Test;Integrated Security=SSPI;">

[<TypeProvider>] 
type public MeasureTypeProvider(cfg:TypeProviderConfig) as this = 
inherit TypeProviderForNamespaces()

let assembly = System.Reflection.Assembly.GetExecutingAssembly()
let typesNamespace = "Types.Domain"
let providedTypeBuilder = ProvidedTypeBuilder.Default
let db = DatabaseSchema.GetDataContext()

let types =
    query { for m in db.Table do select m }
    |> Seq.map(fun dataEntity ->
                    let className:string = dataEntity.Identifier
                    let providedTypeDefinition =
                            ProvidedTypeDefinition(className = className,
                                                   baseType = Some typeof<obj>,
                                                   IsErased=false)
                    providedTypeDefinition.AddMember(
                                ProvidedConstructor([], InvokeCode = fun [] -> <@@ obj() @@>))
                    providedTypeDefinition
               ) |> Seq.toList

let rootType =
    let providedTypeDefinition = 
           ProvidedTypeDefinition(assembly, 
                                  typeNamespace, 
                                  "DomainTypes", 
                                  Some typeof<obj>, 
                                  IsErased=false)
    providedTypeDefinition.AddMembersDelayed(fun () -> types)
    this.AddNamespace(typesNamespace, [providedTypeDefinition])
    providedTypeDefinition

let path = Path.GetDirectoryName(assembly.Location) + @"\GeneratedTypes.dll"
do rootMeasureType.ConvertToGenerated(path)

[<assembly:TypeProviderAssembly>] 
do()

我发现的另一个问题是,当iSerase=true时,我能够提供从值类型派生的类型(如decimal),但当iSerase=false时,我无法提供这些派生类型。这是因为值类型是密封的,所以不可能生成“实数”“从值类型派生的类型。

您应该将更新作为答案发布。这将有助于未来的游客。
File.Delete assemblyFileName