private IGeometry GetGeometry(int partIndex) { IGeometry geometry; if (!_perPart) { geometry = GeometryFactory.Clone(_baseGeometry); } else if (_baseGeometry is ICurve) { var geometryCollection = _baseGeometry as IGeometryCollection; if (geometryCollection == null || geometryCollection.GeometryCount == 1) { geometry = GetErrorGeometry((ICurve)_baseGeometry); } else { var curve = (ICurve)geometryCollection.get_Geometry(partIndex); geometry = GetErrorGeometry(curve); } return(geometry); } else { IGeometryCollection geometryCollection; if (_baseGeometry.GeometryType == esriGeometryType.esriGeometryPolygon) { geometryCollection = QaGeometryUtils.CreatePolygon(_baseGeometry); } else if (_baseGeometry.GeometryType == esriGeometryType.esriGeometryPolyline) { geometryCollection = QaGeometryUtils.CreatePolyline(_baseGeometry); } else if (_baseGeometry.GeometryType == esriGeometryType.esriGeometryMultiPatch) { geometryCollection = new MultiPatchClass(); } else { throw new InvalidOperationException("unhandled geometry type " + _baseGeometry.GeometryType); } int segmentCount = _indexedSegments.GetPartSegmentCount(partIndex); var partSegments = new List <SegmentProxy>(segmentCount); for (int iSegment = 0; iSegment < segmentCount; iSegment++) { partSegments.Add(_indexedSegments.GetSegment(partIndex, iSegment)); } SegmentUtils.CreateGeometry(geometryCollection, partSegments); geometry = (IGeometry)geometryCollection; } return(geometry); }