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

问题描述:

我想通过使用实际对象的名称将对象拆箱到其实际类型。如何通过类的名称将unbox对象转换为实际对象

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. 

我能做到这一点时,我有实际类型的对象的运行时间,但我只有类型/对象

+1

不能投放,而一个类型强制转换为,你有什么与做规划'actualObject'如果你不知道类型? – Lee

+0

我已经调用了这个方法moduleInfo.GetMethod(“methodName”)。Invoke(null,args),我得到了返回类型的对象类型,我想将对象转换为实际的对象类型。 –

+0

你知道'methodName'的返回类型是什么吗?如果是这样,你可以投。如果你不知道它是什么,那么你需要解释你想要对结果做什么。 – Lee

unbox功能投下的OBJ一种类型'T的名称。要做到这一点,它需要知道投射到哪种类型。通常这可以通过周围环境的类型推断来解决,但在这种情况下,编译器没有这些信息。因此您需要提供类型。这样做的一种方式是类型参数明确地传递给unbox

let actualEmployee = unbox<Employee> empAsObject 

注意,unbox操作是不安全的。如果该值实际上不是Employee,则会引发运行时异常。当您决定跳出类型系统和框值时,这是您要承担的风险。

一般来说,编译器无法推断出具体的子类型是什么。如果你失去了类型信息,你必须将其转换回(在抛出异常的风险):

let actualObject = empAsObject :?> Employee