2014-10-02 16 views
2

說我有這樣的鑄造的目的是泛型類型,而無需提供參數

let a = new List<int>() 
let b = a :> obj :?> List<obj> 

它拋出一個異常說,它不能做到這一點,因爲一個代碼是List<int>,而我試圖使其成爲List<obj>。 我明白爲什麼這是一個問題。它不能魔術般地爲我創建一個用obj替換所有int類型的接口,但我能在這裏做什麼?

我有一個對象,我知道這是一個東西的列表。我如何訪問這些元素,而不關心它們的類型?所以我需要一個一般的,不是一個具體的列表,解決

我具體的例子不使用列表。

+0

你能澄清一下嗎 - 你有一個已知的非對象類型的列表嗎(在你的例子中是'int'),還是你有一個你知道的對象是一些未知類型的列表? – kvb 2014-10-02 18:24:19

回答

4

在列表中的情況下,你可以使用System.Collections.IList訪問元素

open System.Collections 
open System.Collections.Generic 

let x = List<int>() 
let y: IList = downcast (x :> obj) 

這種方法也可以推廣:讓您的泛型類實現非泛型接口:

type IT = 
    abstract Value: obj 

type T<'a>(a: 'a) = 
    member val Value = a; 
    interface IT with 
     member this.Value = upcast this.Value 

如果不是一個選項(即,因爲你不能在課堂上的變化),你總是可以訴諸反射

type T<'a>(a: 'a) = 
    member val Value = a; 

type Action = 
    static member Do(a: T<_>) = printfn "%A" a.Value 

let v = T(10) 
let mi = typeof<Action>.GetMethod("Do").MakeGenericMethod(v.GetType().GetGenericArguments().[0]) 
mi.Invoke(null, [|v|]) 
+0

看起來像是反思。 – 2014-10-02 20:45:38