代码改变世界

为IEnumDataset实现foreach方式遍历

2011-04-20 14:51  贼寇在何方  阅读(...)  评论(...编辑  收藏

和许多其他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 {
    getreturn value; }
}
object System.Collections.IEnumerator.Current {
    getreturn 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())
{
   // 执行代码
}