Особенности работы с массивом детейлов

Базовая функциональность по работе с массивами детейловых объектов

DetailArray поддерживает базовую функциональность по работе с массивами детейловых объектов:

  • Поддержка ссылки на шапку (агрегатор).
  • Поддержка коллекции:
    • добавление (AddObject, AddRange),
    • вставка (Insert),
    • удаление (Remove, RemoveByIndex, RemoveByKey),
    • очистка (Clear),
    • установка/взятие значения (GetByKey, SetByKey),
    • перемещение (Move),
    • количество объектов (Count),
    • перебор объектов в конструкции foreach.
  • Поддержка упорядочения (порядка, в котором лежат объекты данных).

Агрегирующие функции

Чтобы среди объектов, находящихся в массиве детейлов, посчитать какую-либо агрегирующую функцию (сумма, макс., мин., среднее значение, что-либо произвольное), необходимо в классе, унаследованном от DetailArray, определить функцию без параметров, которая возвращает некоторое значение. Далее, к этой функции необходимо приписать атрибут AggregationFunction. Параметрами являются: имя свойства, для которого эта агрегирующая функция, и строка формата (String.Format), в соответствии с которой значение будет выводиться пользователю.

Упорядочивание

Объекты в массиве детейлов могут быть упорядочены (именно упорядочены, а не отсортированы), т.е. располагаться в каком-либо, строго определённом порядке.

Для того, чтобы ввести упорядочение, необходимо в детейловый класс данных ввести целочисленное (System.Int32) свойство с приписанным атрибутом Order.

Получение типа DetailArray по его наименованию

Чтобы получить тип детейла, имея тип агрегатора и наименование DetailArray, необходимо воспользоваться методом Information.GetItemType.

Сигнатура метода:

public static System.Type ICSSoft.STORMNET.Information.GetItemType (
        System.Type AgregatorType,
        string DetailPropertyName ) 	

где AgregatorType это тип класса-агрегатора, а DetailPropertyName это наименование списка детейлов, тип которых необходимо получить.

Метод возвращает объект типа System.Type, содержащий описание типа-детейла.

Написание LINQ-запросов к уже полученному списку DetailArrayOf…

Чтобы написать LINQ-запрос к детейлам, необходимо сначала привести их к необходимому типу (т.к. DetailArrayOf… не поддерживает интерфейс IEnumerable, то непосредственно к нему LINQ-методы (такие как Select, ToList и пр.) не применятся).

Пусть есть класс Aggregator, имеющий детейловый класс Det, тогда конструкция ниже выдаст ошибку, т.к. ему необходимо указать тип, объектами которого будет заполнен новый список:

Aggregator aggr = new Aggregator();
aggr.DetailArrayOfDet.ToList(); 

Если указать тип, то ошибка изменится на: Невозможно привести тип DetailArrayOfDet к типу IEnumerable&lt<Det>:

Aggregator aggr = new Aggregator();
aggr.DetailArrayOfDet.ToList<Det>(); 

Правильным способом является следующий:

Aggregator aggr = new Aggregator();
aggr.DetailArrayOfDet.Cast<Det>.ToList();