gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:34:26 26 4
gpt4 key购买 nike

假设我有这样的代码

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

它抛出一个异常,说它不能这样做,因为一个是 List<int>当我试图让它成为 List<obj> 时.我明白为什么这是个问题。它不能神奇地为我创建一个将所有 int 类型替换为 obj 的接口(interface),但我可以在这里做什么?

我有一个对象,我知道它是一个列表。我怎样才能访问元素而不关心它们的类型?

我的具体示例不使用列表,因此我需要一个通用的解决方案,而不是特定于列表的解决方案。

最佳答案

如果是列表,您可以使用 System.Collections.IList 访问元素

open System.Collections
open System.Collections.Generic

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

这种方法也可以推广:让你的泛型类实现非泛型接口(interface):

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

关于f# - 在不提供参数的情况下将对象转换为泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26166581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com