Я пишу класс, который реализует интерфейсы ICollection<T>
и ICollection
.Как реализовать метод ICollection.CopyTo?
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];
}
Однако необщая версия методы путает меня немного. Во-первых, как проверить следующее условие исключения?
Тип источника ICollection не может быть автоматически присвоен типу целевого массива.
Во-вторых, есть способ использовать существующую общую реализацию для уменьшения дублирования кода?
Вот моя работа в прогресс реализации:
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);
}
Ну 'SetValue', безусловно, бросить исключение броска для вас. – juharr
Можете ли вы реализовать свой класс, взяв из ['CollectionBase'] (https://msdn.microsoft.com/en-us/library/system.collections.collectionbase_methods%28v=vs.110%29.aspx), чтобы сохранить работу ? Он реализует 'CopyTo()' для вас. –
посмотрите на этот вопрос - http://stackoverflow.com/questions/5843958/how-to-make-a-copy-of-a-reference-type – harmoniemand