gpt4 book ai didi

reflection - F# 相当于 C# typeof(IEnumerable<>)

转载 作者:行者123 更新时间:2023-12-03 07:15:53 24 4
gpt4 key购买 nike

我有一段代码,我需要弄清楚给定类型是否实现 IEnumerable<T> (我不关心T)

我已经尝试过(t:System.Type以防万一您想知道)

let interfaces = t.GetInterfaces()
let enumerbale =
interfaces.Any(fun t ->
t.GetGenericTypeDefinition() = typeof<IEnumerable<>>
)

但是这不会编译(编译不喜欢<>)。然后我尝试了

let interfaces = t.GetInterfaces()
let enumerbale =
interfaces.Any(fun t ->
t.GetGenericTypeDefinition() = typeof<IEnumerable<'a>>
)

但是收到一条警告,指出“a 是对 obj 的约束”。我不想弄清楚是否 IEnumerable<obj>已实现,但 IEnumerabl<> .

任何人都知道解决方案,顺便说一句,也可以随意对上面的代码发表评论。

最佳答案

这应该有效:

typedefof<System.IEnumerable<_>>

编辑

正如 Tomas 所说,_ 没有什么特别之处。此处使用通配符; F# 推断类型 obj是此上下文中最通用的适用类型,因此这与使用 typedefof<System.IEnumerable<obj>> 相同。 。但在某些情况下,这种工作方式可能会有点障碍。例如,如果您定义一个接口(interface) type I<'a when 'a :> I<'a>> = interface end ,那么你就不能使用typedefof<I<_>> ,因为I<obj>不满足通用约束,F# 无法推断出另一个更合适的类型。即使没有递归约束,这种情况也可能发生(例如 type I<'a when 'a : struct and 'a :> System.ICloneable> = interface end 。这与 C# 的方法相反,C# 的方法在类似情况下工作得很好。

至于您的代码本身,我认为您还需要进行一些其他更改,例如在调用 GetGenericTypeDefinition 之前确保接口(interface)是通用的。这是我编写测试函数的方式:

(fun t -> t.IsGenericType && (t.GetGenericTypeDefinition() = typedefof<_ seq>))

关于reflection - F# 相当于 C# typeof(IEnumerable<>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2480250/

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