为IEnumDataset实现foreach方式遍历
2011-04-20 14:51 贼寇在何方 阅读(2351) 评论(2) 编辑 收藏 举报和许多其他GIS公司提供的跨语言SDK一样,ESRI的ArcObjects使用COM技术提供跨语言支持
对于ArcObjects的.Net SDK,不得不说是相当的垃圾,纯纯的COM API,没有做任何封装
比如IEnumDataset这个类型,对其进行迭代,需要这样:
IDataset ds = enumDataset.Next();while( ds != null ){// 执行代码ds = enumDataset.Next();}
因为IEnumDataset是COM当中的类型,没有实现IEnumerator,也就不能够用foreach遍历,更不能享受Linq带来的便利用法。
下面开始对IEnumDataset做了封装,使之实现IEnumerator接口。
首先创建一个新的类,实现IEnumerator<IDataset>, IEnumerable<IDataset>:
publicclassDatasetEnumerator : IEnumerator<IDataset>, IEnumerable<IDataset>{IEnumDataset e;IDataset value = null;public DatasetEnumerator(IEnumDataset e){this.e = e;}······
实现IEnumerable<IDataset>以及他的父接口IEnumerable:
publicIDataset Current {get { return value; }}object System.Collections.IEnumerator.Current {get { return value; }}publicbool MoveNext() {return (value = e.Next()) != null;}publicvoid Reset() {}
实现IEnumerator<IDataset>以及父接口IDisposable, IEnumerator:
publicIEnumerator<IDataset> GetEnumerator() {returnthis;}System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {returnthis;}publicvoid Dispose() { }
大功告成,我们再做一个扩展方法,实现从IEnumDataset创建DatasetEnumerator:
staticpublicclassExtensionMethods{staticpublicDatasetEnumerator GetEnumerator(thisIEnumDataset e){returnnewDatasetEnumerator(e);}}
可以使用了:
foreach( var ds in enumDataset.GetEnumerator()){// 执行代码}