C# IEnumUnknown 系统接口定义与实现

接口类

 

[ComImport]
    [SecurityCritical]
    [Guid( " 00000100-0000-0000-C000-000000000046 ")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
     public  interface IEnumUnknown
    {
        [PreserveSig]
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
         int Next(
            [In, MarshalAs(UnmanagedType.U4)]  int elementArrayLength,
            [Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.IUnknown, SizeParamIndex =  0)] object[] elementArray,
            [MarshalAs(UnmanagedType.U4)]  out  int fetchedElementCount);

        [PreserveSig]
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
         int Skip([In, MarshalAs(UnmanagedType.U4)]  int count);

        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
         void Reset();

        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
         void Clone([MarshalAs(UnmanagedType.Interface)]  out IEnumUnknown enumerator);
    } 

实现类

 

  public  class EnumUnknown : IEnumUnknown
    {
         ///   <summary>
        
///   原数据
        
///   </summary>
         private  object[] _sources;
         ///   <summary>
        
///   当前下标
        
///   </summary>
         private  int current;
         ///   <summary>
        
///   大小
        
///   </summary>
         private  int size;
         ///   <summary>
        
///   构造函数
        
///   </summary>
        
///   <param name="sources"></param>
         public EnumUnknown( object[] sources)
        {
            _sources = sources;
             this.current =  0;
             this.size = (sources ==  null) ?  0 : _sources.Length;
        }
         #region IEnumUnknown 成员
 
         ///   <summary>
        
///   跳转到某个
        
///   </summary>
        
///   <param name="index"> 所需要跳转的数量 </param>         
        
///   <returns> 是否成功 </returns>
        [PreserveSig]
         public  int Skip([In, MarshalAs(UnmanagedType.U4)]  int celt)
        {
             this.current += celt;
             if ( this.current >=  this.size)
            {
                 return  1;
            }
             return  0;
        }
         ///   <summary>
        
///   重置
        
///   </summary>
         public  void Reset()
        {
             this.current =  0;
        }
         ///   <summary>
        
///   复制
        
///   </summary>
        
///   <param name="enumerator"> 对象 </param>
         public  void Clone( out IEnumUnknown enumerator)
        {
            enumerator =  new EnumUnknown( this._sources);
        }
        
         public  int Next( int elementArrayLength, object[] elementArray,  out  int fetchedElementCount)
        {
            fetchedElementCount =  0;
             if (elementArrayLength <  0)
            {
                 return - 2147024809;
            }

             int index =  0;

             while (( this.current <  this.size) && (elementArrayLength >  0))
            {
                 object item =  this._sources[ this.current];
                 bool useDisplayMember =  false;

                 if (!useDisplayMember)
                {
                     if (item !=  null)
                        elementArray[index] = item;
                }
                current++;
                index++;
                elementArrayLength--;
            }

            fetchedElementCount = index;
             if (elementArrayLength !=  0)
            {
                 return  1;
            }

             return  0;
        }

         #endregion
    }

 

转载于:https://www.cnblogs.com/xgd224743/archive/2012/09/11/2680071.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值