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

System.InvalidCastException: Specified cast is not valid when trying to use Reflection in F#

我正在尝试在 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

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

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