2017-09-15 77 views
3

我想通過使用實際對象的名稱將對象拆箱到其實際類型。如何通過類的名稱將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

回答

5

unbox功能投下的OBJ一種類型'T的名稱。要做到這一點,它需要知道投射到哪種類型。通常這可以通過周圍環境的類型推斷來解決,但在這種情況下,編譯器沒有這些信息。因此您需要提供類型。這樣做的一種方式是類型參數明確地傳遞給unbox

let actualEmployee = unbox<Employee> empAsObject 

注意,unbox操作是不安全的。如果該值實際上不是Employee,則會引發運行時異常。當您決定跳出類型系統和框值時,這是您要承擔的風險。

4

一般來說,編譯器無法推斷出具體的子類型是什麼。如果你失去了類型信息,你必須將其轉換回(在拋出異常的風險):

let actualObject = empAsObject :?> Employee

相關問題