实现 IEnumerable当基类实现 IEnumerable 时
是否有一种简洁的方法可以在基类型实现非泛型 IEnumerable
的类型中实现 IEnumerable<'T>
?我正在使用下面的 mkEnumerator 函数来执行此操作,但它似乎过多。
open System
open System.Collections.Generic
open System.Configuration
let mkEnumerator<'T> (e : System.Collections.IEnumerator) =
{ new IEnumerator<'T> with
member __.Current = e.Current |> unbox
interface System.Collections.IEnumerator with
member __.Current = e.Current
member __.MoveNext() = e.MoveNext()
member __.Reset() = e.Reset()
interface IDisposable with
member __.Dispose() =
match e with
| :? IDisposable as d -> d.Dispose()
| _ -> () }
type MyConfigElement() =
inherit ConfigurationElement()
type MyConfigCollection() =
inherit ConfigurationElementCollection()
override __.CreateNewElement() = Unchecked.defaultof<_>
override __.GetElementKey(_) = Unchecked.defaultof<_>
interface IEnumerable<MyConfigElement> with
member __.GetEnumerator() = mkEnumerator<MyConfigElement> (base.GetEnumerator())
更新
按照 desco 的建议,我现在使用:
type MyConfigCollection() =
inherit ConfigurationElementCollection()
...
interface IEnumerable<MyConfigElement> with
member __.GetEnumerator() = (Seq.cast<MyConfigElement> this).GetEnumerator()
Is there a succinct way to implement IEnumerable<'T>
in a type whose base type implements the non-generic IEnumerable
? I'm using the mkEnumerator
function below to do it, but it seems excessive.
open System
open System.Collections.Generic
open System.Configuration
let mkEnumerator<'T> (e : System.Collections.IEnumerator) =
{ new IEnumerator<'T> with
member __.Current = e.Current |> unbox
interface System.Collections.IEnumerator with
member __.Current = e.Current
member __.MoveNext() = e.MoveNext()
member __.Reset() = e.Reset()
interface IDisposable with
member __.Dispose() =
match e with
| :? IDisposable as d -> d.Dispose()
| _ -> () }
type MyConfigElement() =
inherit ConfigurationElement()
type MyConfigCollection() =
inherit ConfigurationElementCollection()
override __.CreateNewElement() = Unchecked.defaultof<_>
override __.GetElementKey(_) = Unchecked.defaultof<_>
interface IEnumerable<MyConfigElement> with
member __.GetEnumerator() = mkEnumerator<MyConfigElement> (base.GetEnumerator())
Update
Following desco's suggestion, I'm now using:
type MyConfigCollection() =
inherit ConfigurationElementCollection()
...
interface IEnumerable<MyConfigElement> with
member __.GetEnumerator() = (Seq.cast<MyConfigElement> this).GetEnumerator()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
布莱恩建议的简短版本:
shorter version of Brian's suggestion:
我认为你的方式看起来最好。我想这更简洁(我没有尝试端到端以确保它有效):
但我想知道它是否分配更多。
正如@desco 所指出的,这甚至更短:
I think your way looks best. I guess this is more succinct (I have not tried it end-to-end to ensure it works):
but I wonder if it allocates more.
As is pointed out by @desco, this is even shorter: