在不提供参数的情况下将对象转换为泛型类型

时间:2014-10-02 17:52:36

标签: f#

说我有这样的代码

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

它引发了一个例外情况,说它不能这样做,因为一个List<int>,而我试图使其成为List<obj>。 我明白为什么这是一个问题。它不能神奇地为我创建一个用obj替换所有int类型的接口,但是我可以在这做什么?

我有一个对象,我知道它是一个东西的列表。我如何访问元素而不关心它们的类型?

我的具体示例并未使用列表,因此我需要一般而非特定于列表的解决方案。

1 个答案:

答案 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|])