Reflection System.InvalidCastException:尝试在F中使用反射时,指定的强制转换无效#
我正在尝试用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
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)