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