/
DynamicCollectionExtensions.cs
151 lines (130 loc) · 5.55 KB
/
DynamicCollectionExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
using System;
using System.Collections;
using InfinniPlatform.Properties;
namespace InfinniPlatform.Dynamic
{
/// <summary>
/// Extension methods for working with dynamic objects as collections.
/// </summary>
public static class DynamicCollectionExtensions
{
/// <summary>
/// Возвращает элемент коллекции.
/// </summary>
/// <param name="collection">Исходная коллекция.</param>
/// <param name="index">Индекс элемента.</param>
/// <returns>Элемент коллекции.</returns>
public static object GetItem(this object collection, int index)
{
object result = null;
if (collection != null && index >= 0)
{
if (collection is IList list)
{
if (index < list.Count)
{
result = list[index];
}
}
else
{
if (collection is IEnumerable enumerable)
{
foreach (var item in enumerable)
{
if (index == 0)
{
result = item;
break;
}
--index;
}
}
}
}
return result;
}
/// <summary>
/// Устанавливает элемент коллекции.
/// </summary>
/// <param name="collection">Исходная коллекция.</param>
/// <param name="index">Индекс элемента.</param>
/// <param name="item">Элемент коллекции.</param>
public static void SetItem(this object collection, int index, object item)
{
ModifyCollection(collection, list => list[index] = item);
}
/// <summary>
/// Добавляет элемент в коллекцию.
/// </summary>
/// <param name="collection">Исходная коллекция.</param>
/// <param name="item">Элемент коллекции.</param>
public static void AddItem(this object collection, object item)
{
ModifyCollection(collection, list => list.Add(item));
}
/// <summary>
/// Добавляет элемент в коллекцию.
/// </summary>
/// <param name="collection">Исходная коллекция.</param>
/// <param name="index">Индекс элемента.</param>
/// <param name="item">Элемент коллекции.</param>
public static void InsertItem(this object collection, int index, object item)
{
ModifyCollection(collection, list => list.Insert(index, item));
}
/// <summary>
/// Удаляет элемент из коллекции.
/// </summary>
/// <param name="collection">Исходная коллекция.</param>
/// <param name="item">Элемент коллекции.</param>
public static void RemoveItem(this object collection, object item)
{
ModifyCollection(collection, list => list.Remove(item));
}
/// <summary>
/// Удаляет элемент из коллекции.
/// </summary>
/// <param name="collection">Исходная коллекция.</param>
/// <param name="index">Индекс элемента.</param>
public static void RemoveItemAt(this object collection, int index)
{
ModifyCollection(collection, list => list.RemoveAt(index));
}
/// <summary>
/// Перемещает элемент в коллекции.
/// </summary>
/// <param name="collection">Исходная коллекция.</param>
/// <param name="item">Элемент коллекции.</param>
/// <param name="delta">Смещение индекса.</param>
public static void MoveItem(this object collection, object item, int delta)
{
ModifyCollection(collection, list =>
{
var index = list.IndexOf(item);
if (index >= 0)
{
var newIndex = index + delta;
if (newIndex != index && newIndex >= 0 && newIndex < list.Count)
{
list.RemoveAt(index);
list.Insert(newIndex, item);
}
}
});
}
private static void ModifyCollection(object collection, Action<IList> modify)
{
if (collection == null)
{
throw new ArgumentNullException(nameof(collection), Resources.TargetObjectCannotBeNull);
}
var list = collection as IList;
if (list == null)
{
throw new NotSupportedException(Resources.CollectionCanNotBeModified);
}
modify(list);
}
}
}