제공되는 필드를 기반으로 간단한 레코드 유형을 만들고 싶습니다. 이다F #에서 레코드 유형 생성
:
let rectype = MakeRecordType(['fieldname1'; 'fieldname2'])
가 공급자를 입력로 직접 이동은 간단한 작업에 대한 무거운 gunpower 것 같습니다.
다른 방법이 있습니까? 갱신
내가 Creating F# record through reflection
제공되는 필드를 기반으로 간단한 레코드 유형을 만들고 싶습니다. 이다F #에서 레코드 유형 생성
:
let rectype = MakeRecordType(['fieldname1'; 'fieldname2'])
가 공급자를 입력로 직접 이동은 간단한 작업에 대한 무거운 gunpower 것 같습니다.
다른 방법이 있습니까? 갱신
내가 Creating F# record through reflection
은 최종 결과의 유용성을 따로 두는 매우 유사 다음과 같은 질문을 발견, 아래의 코드 조각은 my other related answer의 정신을 요구 정확히 무엇을 달성 :
는#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
의 스케치 구현은 임의허용 배열은 type name
이고 배열은 field names
이고, 배열은 field type names
입니다. 그런 다음 커튼 뒤에 요청 된 레코드 유형을 정의하는 F # 코드를 어셈블하고 CodeDom provider
을 통해이 코드를 컴파일하고 컨테이너 어셈블리를로드하고 Reflection을 통해 새로 생성 된 합성 레코드 유형에 대한 액세스를 제공합니다. 당신이 그렇지 않으면 동적으로 생성 된 레코드 유형을 사용하는 방법을 이해하지 않습니다
IsRecordType=true
Record fields: [|System.String Field1; Int32 Field2|]
: 테스트 조각
는 순수하게 합성 형
myType
개념의 증거를 보여? 'type MyRecord = {field1 : string, field2 : string}' – yamen@yamen 다른 형식과 거의 같은 방식으로 사용합니다. – nicolas
무슨 뜻입니까? 동적 속성 목록을 제공하는 경우 동적으로 또는 정적으로 사용합니까? 정적이라면 먼저 정적으로 정의하지 않겠습니까? – yamen