2014-10-02 64 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