说我有这样的代码
let a = new List<int>()
let b = a :> obj :?> List<obj>
它引发了一个例外情况,说它不能这样做,因为一个List<int>
,而我试图使其成为List<obj>
。
我明白为什么这是一个问题。它不能神奇地为我创建一个用obj替换所有int类型的接口,但是我可以在这做什么?
我有一个对象,我知道它是一个东西的列表。我如何访问元素而不关心它们的类型?
我的具体示例并未使用列表,因此我需要一般而非特定于列表的解决方案。
答案 0 :(得分: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|])