Доброго дня! У меня есть процесс, в котором есть контекстная переменная блок (context.Perechenj), и она записывается в справочник, в которой есть переменная блок с аналогичными полями. Мне нужно одним скриптом создать справочник, а вторым скриптом обновить все поля переменной блок в справочнике на поля из контекста. Я не понимаю как мне правильно обратиться к каждому элементу переменной блок в справочнике и соответствующему элементу переменной блок контекста. При создании справочника заполняю поля переменной блок так: foreach (var a in context.Perechenj) { // Создаю новый объект, который является элементом перечня var b = new EleWise.ELMA.ConfigurationModel.Remonty_Perechenj(); // Применяю каждое поле b.Field1 = a.Field1; b.Field2 = a.Field2; // Добавляю этот элемент как новый элемент переменной блок sprav.Perechenj.Add (b); } Далее мне нужно другим скриптом получить справочник (получаю справочник по LoadOrNull(Id)) и обновить все элементы его переменной типа блок. Как правильно к ним обратиться? Я пытаюсь обратиться так: var v = context.Perechenj[1]; В результате получаю ошибку при компиляции: Cannot create an instance of the abstract class or interface 'System.Collections.Generic.ISet<EleWise.ELMA.ConfigurationModel.Remonty_Perechenj>' Через foreach можно перебирать только элементы одного списка. Видимо нужно через индекс (циклом for, например). И как узнать какой тип имеет переменная блок (что это за коллекция такая?), чтобы я мог создать аналогичный объект, заполнить отдельно потом присвоить его вместо переменной блок справочника? При создании объекта типа: System.Collections.Generic.ISet<EleWise.ELMA.ConfigurationModel.Remonty_Perechenj> Тоже матюкается что класс абстрактный, и вообще иди отсюда...
Что-то слишком много букв. Сделаю проще: Как можно обратиться к элементам переменной блок используя индекс (то есть через цикл for, например)?
Я понял вопрос так: Как получить все строки из блока. Верно? Если да, то код ниже. var strAll = ""; foreach (var item in context.BlockName) { strAll += item.Field1.Value + "; "; strAll += item.Field2.Value; strAll += "\n"; } В результате выведется столько строк, сколько есть строк в блоке. Каждая строка будет содержать значения Полей через точку с запятой.
Нет. Вопрос 1: создать переменную такого же типа что и контекстная переменная-блок (я не понимаю что это за коллекция и как ей пользоваться, говорит что это 'ISet', но также говорит что это абстрактный класс, а значит создать экземпляр нельзя). Вот, из логов компилятора сделал вывод что контекстная переменная блок имеет следующий тип: System.Collections.Generic.ISet<EleWise.ELMA.ConfigurationModel.Remonty_Perechenj> Вопрос 2: взять две переменные типа блок и всем значениям элементов переменной блок 1 присвоить значения элементов переменной блок 2.
Вопрос1. var itemAtBlock = new Model.Entities.ProcessContext.ИмяКлассаБлока(); ИмяКлассаБлока - это можно найти, если пойти в контекст, открыть Настройки блока, раскрыть "Расширенные настройки" и там значение поля "Имя класса". Вопрос 2. ИЛИ я не понял вопрос ИЛИ это надо сделать foreach'ем по блоку-источнику, как я написал выше. Дополнительно, внутри foreach'а надо сделать foreach (var itemAtBlockSrc in context.BlockSrc) { var itemAtBlockDst = new Model.Entities.ProcessContext.BlockDstClassName(); itemAtBlockDst.Field1 = itemAtBlockSrc.Field1; ... context.BlockDst.Add(itemAtBlockDst); } Всё.
Вопрос 1: агааа, вроде выглядит правдоподобно, проверю, спасибо! Вопрос 2: мне нужно присвоить новые значения уже существующим элементам context.BlockDst, а не создать новые элементы
Вопрос 2. Ну, это уже алгоритмическая задача - как из одной таблицы перенести в другую. Тут уже не ELMA-специфик. Можно вместо var itemAtBlockDst = new Model.Entities.ProcessContext.BlockDstClassName(); написать Model.Entities.ProcessContext.BlockDstClassNam itemAtBlockDst = GetRowItemATBlockDst(SomeFieldValueFromItemAtBlockSrc); где функция GetRowItemATBlockDst ищет по какому-то значению, соответствие между записью в Src-блоке и строчкой в Dst-блоке.
Подвох в том что я изначально не знаю какие там могут быть значения (то есть искать не по чем), но знаю точно что их кол-во и порядок совпадают, нужно просто сопоставить первый с первым, второй со вторым и т.д. Изначально основной вопрос с которым я создал эту тему был по типу переменной блок. Именно что это за класс и что за тип коллекции, чтобы я понимал какие у меня есть методы для работы с его экземплярами. Например - можно ли перебирать его элементы итератором.
Попробуйте var arrayFromBlock = context.BlockDst.ToArray(); Никогда не было нужно, соответственно не проверял, что работает, но не вижу причин, почему это не должно работать. Думаю, что это именно то, что Вам надо - работа с блоком, как с массивом.
Проверил своё предположение - работает, как и ожидалось. var blockAsArray = context.BlockDst.ToArray(); for (int i = 0; i < blockAsArray.Count(); i++) { Console.WriteLine("blockAsArray[" + i + "].Field1: " + blockAsArray.Field1); } Думаю, это именно то, что Вы и искали!