如何通过类的名称将unbox对象转换为实际对象

时间:2017-09-15 09:32:46

标签: reflection f# f#-data

我想通过使用实际对象的名称来将对象拆箱到其实际类型。

type Employee = {
    Id:int
    Name:string
}
let defEmployee = {
    Id=1
    Name="Mahi"
}

//actual object
let actualObject = defEmployee
let empAsObject = actualObject :> obj // type with casted in base class
let actualObject = unbox(empAsObject) //here I am trying to unboxing but not 
   able to do it.

当我有实际类型的对象运行时但我只有类型/对象的名称时,我可以这样做

2 个答案:

答案 0 :(得分:5)

unbox函数将obj强制转换为类型'T。要做到这一点,它需要知道要转换为哪种类型。通常,这可以通过来自周围上下文的类型推断来解决,但在这种情况下,编译器没有该信息。因此,您需要提供类型。一种方法是将类型参数显式传递给unbox

let actualEmployee = unbox<Employee> empAsObject

请注意,unbox操作不安全。如果值实际上不是Employee,它将抛出运行时异常。这是您在决定超出类型系统和框值时所采取的风险。

答案 1 :(得分:4)

一般来说,编译器无法推断出具体的子类型是什么。如果您丢失了类型信息,则必须将其强制退回(冒着抛出异常的风险):

let actualObject = empAsObject :?> Employee