如何在F#中枚举枚举/类型告诉我们如何在F#中获取.Net枚举类型的枚举器:
利用: Enum.GetValues(typeof<MyType>)
但是,当我将其投入使用时,我发现了一个限制。我可以解决该限制,但是我正在寻找更好的方法。
问题在于该解决方案返回一个.Net对象数组,但是要使用它,我们需要强制转换,并且强制转换很难进行迭代。
type Colors =
| Red = 0
| Blue = 1
| Green = 2
// Strongly typed function, to show the 'obj' in real use
let isFavorite color = color = Colors.Green
// Iterate over the Enum (Colors)
for color in Enum.GetValues(typeof<Colors>) do
printfn "Color %A. Is Favorite -> %b" color (isFavorite color) // <-- Need to cast
在(IsFavorite color)
提高之间的冲突类型Colors
和(预期)obj
(实际)
这很容易解决:
for obj in Enum.GetValues(typeof<Colors>) do
printfn "Color %A. Is Favorite -> %b" obj (isFavorite (unbox<Colors> obj))
但是,如果一个人需要(unbox<Colors> obj)
在多个地方怎么办?
本地let color = ...
就足够了,但是,理想情况下,我们将使用返回一个的枚举表达式seq<Colors>
。
我已经能够构建该表达式,但是它是:难以建造;以及b。wind。
let colorsSeq =
Seq.cast (Enum.GetValues(typeof<Colors>))
|> Seq.map (fun o -> unbox<Colors> o)
for color in colorsSeq do
printfn "Color %A. Is Favorite -> %b" color (isFavorite color)
有更好的表达方式吗?
这似乎是最简单的版本:
let t : Colors seq = unbox (Enum.GetValues(typeof<Colors>))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句