加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何实现ICollection.CopyTo方法?

发布时间:2020-12-15 17:36:50 所属栏目:百科 来源:网络整理
导读:我正在写一个实现ICollection T和ICollection界面. MSDN说这些有点不同. ICollectionT.CopyTo 采用T []参数,而 ICollection.CopyTo 则使用System.Array参数.异常抛出之间也有区别. 这是我的通用方法的实现(我相信它是完全功能的): void ICollectionPlcParam
我正在写一个实现ICollection< T>和ICollection界面.

MSDN说这些有点不同. ICollection<T>.CopyTo采用T []参数,而ICollection.CopyTo则使用System.Array参数.异常抛出之间也有区别.

这是我的通用方法的实现(我相信它是完全功能的):

void ICollection<PlcParameter>.CopyTo(PlcParameter[] array,int arrayIndex)
{
    if (array == null)
        throw new ArgumentNullException("array");
    if (arrayIndex < 0)
        throw new ArgumentOutOfRangeException("arrayIndex");
    if (array.Length - arrayIndex < Count)
        throw new ArgumentException("Not enough elements after arrayIndex in the destination array.");

    for (int i = 0; i < Count; ++i)
        array[i + arrayIndex] = this[i];
}

然而,非泛型版本的方法让我有点困惑.首先,我如何检查以下异常情况?

The type of the source ICollection cannot be cast automatically to the type of the destination array.

第二,有没有办法利用现有的通用实现来减少代码重复?

这是我正在进行的实施:

void ICollection.CopyTo(Array array,int index)
{
    if (array == null)
        throw new ArgumentNullException("array");
    if (index < 0)
        throw new ArgumentOutOfRangeException("arrayIndex");
    if (array.Rank > 1)
        throw new ArgumentException("array is multidimensional.");
    if (array.Length - index < Count)
        throw new ArgumentException("Not enough elements after index in the destination array.");

    for (int i = 0; i < Count; ++i)
        array.SetValue(this[i],i + index);
}

解决方法

您已经完成了大部分实现ICollection< T> .CopyTo的工作.

ICollection.CopyTo有四种可能性:

>它将与ICollection< T>相同.
>因为ICollection< T>的原因将失败会失败
>由于排名不一致会失败.
>它将因为类型不匹配而失败.

我们可以通过调用ICollection< T> .CopyTo来处理前两个.

在每个这些情况下,数组中的PlcParameter []将给我们引用一个强类型的数组.

在后一种情况下,不会.

我们确实想要分别捕获array == null:

void ICollection.CopyTo(Array array,int index)
{
  if (array == null)
    throw new ArgumentNullException("array");
  PlcParameter[] ppArray = array as PlcParameter[];
  if (ppArray == null)
    throw new ArgumentException();
  ((ICollection<PlcParameter>)this).CopyTo(ppArray,index);
}

如果您真的想要在ppArray为null的情况下测试array.Rank == 1,并相应地更改错误消息.

(BTW,为什么要显式地实现ICollection< PlcParameter> .CopyTo?很明显,有助于明确地执行工作,所以人们不必投入所有.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读