Reflection System.InvalidCastException:尝试在F中使用反射时,指定的强制转换无效#

Reflection System.InvalidCastException:尝试在F中使用反射时,指定的强制转换无效#,reflection,f#,Reflection,F#,我正在尝试用F#构造一个记录类型。但是下面的代码给出了System.InvalidCastException。我对F#还不熟悉,很难理解为什么这不起作用。如能详细解释,将不胜感激 open System open Microsoft.FSharp.Reflection type Employee = { Id: Guid Name: string Phone: string BadgeId: string

我正在尝试用F#构造一个记录类型。但是下面的代码给出了
System.InvalidCastException
。我对F#还不熟悉,很难理解为什么这不起作用。如能详细解释,将不胜感激

open System
open Microsoft.FSharp.Reflection

type Employee = {
    Id:          Guid
    Name:        string
    Phone:       string
    BadgeId:     string
    Designation: string
}

let values =
    [
        "bc07e94c-b376-45a2-928b-508b888802c9"
        "A"
        "B"
        "C"
        "D"
    ]
    |> Seq.ofList

let creator = FSharpValue.PreComputeRecordConstructor(typeof<Employee>, System.Reflection.BindingFlags.Public)

let x =
    (
        creator [|
            values
            |> Seq.map (fun y -> y)
        |]

    ) :?> Employee

printfn "%A" x
开放系统
打开Microsoft.FSharp.Reflection
员工类型={
Id:Guid
名称:string
电话:string
BadgeId:字符串
名称:字符串
}
让价值观=
[
“bc07e94c-b376-45a2-928b-508B8802C9”
“A”
“B”
“C”
“D”
]
|>顺序列表
让creator=FSharpValue.precomputerRecordConstructor(typeof,System.Reflection.BindingFlags.Public)
让x=
(
创造者[|
价值观
|>序列图(趣味y->y)
|]
):?>雇员
printfn“%A”x

您的代码有两个问题。首先,您的记录需要一个类型为
Guid
的值,但您给它一个Guid作为字符串。您可以通过在
值列表中装箱来解决此问题:

let values =
    [
        box (Guid("bc07e94c-b376-45a2-928b-508b888802c9"))
        box "A"
        box "B"
        box "C"
        box "D"
    ]
第二个问题是调用
creator
,使用一个包含序列的数组作为参数(有一个额外的包装)。您需要为其提供包含以下值的数组:

let emp = creator (Array.ofSeq values) :?> Employee

您的代码有两个问题。首先,您的记录需要一个类型为
Guid
的值,但您给它一个Guid作为字符串。您可以通过在
值列表中装箱来解决此问题:

let values =
    [
        box (Guid("bc07e94c-b376-45a2-928b-508b888802c9"))
        box "A"
        box "B"
        box "C"
        box "D"
    ]
第二个问题是调用
creator
,使用一个包含序列的数组作为参数(有一个额外的包装)。您需要为其提供包含以下值的数组:

let emp = creator (Array.ofSeq values) :?> Employee

非常感谢。工作很有魅力。我还有一个问题。如果任何字段都是可选的呢?与option类似,这将如何工作?@Robur_131如果字段的类型为
option
,那么您在列表中指定的值必须是相同的类型。这就是当前值的
框(Some(“hello”)
。对于缺少的值,这会变得更加棘手,因为您需要指定一种类型以使其工作-因此您需要
box(None:option)
谢谢!工作很有魅力。我还有一个问题。如果任何字段都是可选的呢?与option类似,这将如何工作?@Robur_131如果字段的类型为
option
,那么您在列表中指定的值必须是相同的类型。这就是当前值的
框(Some(“hello”)
。对于缺少的值,这会变得更加棘手,因为您需要指定一个类型以使其工作-因此您需要
box(None:option)