提供されたフィールドに基づいて単純なレコード タイプを作成したいと思います。
あれは :
let rectype = MakeRecordType(['fieldname1'; 'fieldname2'])
型プロバイダーに直接アクセスすることは、このような単純なタスクに対して強力な武器のように見えます。
他の方法はありますか?
アップデート
リフレクションによる F# レコードの作成と非常によく似た次の質問を見つけました。
提供されたフィールドに基づいて単純なレコード タイプを作成したいと思います。
あれは :
let rectype = MakeRecordType(['fieldname1'; 'fieldname2'])
型プロバイダーに直接アクセスすることは、このような単純なタスクに対して強力な武器のように見えます。
他の方法はありますか?
アップデート
リフレクションによる F# レコードの作成と非常によく似た次の質問を見つけました。
最終結果の有用性はさておき、以下のスニペットは、私の他の関連する回答の精神であなたが求めたものを正確に達成します:
#if INTERACTIVE
#r @"C:\Program Files (x86)\Microsoft F#\v4.0\FSharp.Compiler.dll"
#r @"C:\Program Files (x86)\FSharpPowerPack-1.9.9.9\bin\FSharp.Compiler.CodeDom.dll"
#endif
open System
open System.CodeDom.Compiler
open Microsoft.FSharp.Compiler.CodeDom
open Microsoft.FSharp.Reflection
type RecordTypeMaker (typeName: string, records: (string*string) []) =
let _typeDllName = "Synth"+typeName+".dll"
let _code =
let fsCode = new System.Text.StringBuilder()
fsCode.Append("module ").Append(typeName).Append(".Code\ntype ").Append(typeName).Append(" = {") |> ignore
for rec' in records do fsCode.Append(" ").Append(fst rec').Append(" : ").Append(snd rec').Append(";\n") |> ignore
fsCode.Append("}").ToString()
let _compiled =
use provider = new FSharpCodeProvider()
let options = CompilerParameters([||], _typeDllName)
let result = provider.CompileAssemblyFromSource( options, [|_code|] )
result.Errors.Count = 0
let mutable _type: Type = null
member __.RecordType
with get() = if _compiled && _type = null then
_type <- Reflection.Assembly.LoadFrom(_typeDllName).GetType(typeName+".Code+"+typeName)
_type
のスケッチ実装は、 と を伴うの配列を含む任意の定義をRecordTypeMaker
受け入れます。次に、要求された Record 型を定義する F# コードの一部をアセンブルし、このコードを を介してコンパイルし、コンテナー アセンブリを読み込み、Reflection を介してこの新しく作成された合成 Record 型へのアクセスを提供します。テスト スニペットRecord type
type name
field names
field type names
CodeDom provider
let myType = RecordTypeMaker("Test", [|("Field1", "string"); ("Field2", "int")|]).RecordType
printfn "IsRecordType=%b" (FSharpType.IsRecord(myType))
printfn "Record fields: %A" (FSharpType.GetRecordFields(myType))
純粋な合成型myType
の概念実証を示します。
IsRecordType=true
Record fields: [|System.String Field1; Int32 Field2|]