Я правильно понимаю, что список контейнеров в данном случае - это способ организации хранения/передачи неоднородной структуры.
При работе с неоднородными структурами нужно помнить, что какой бы неоднородной не была бы структура данных вы же всё равно будете обрабатывать её по заранее определённым правилам. Так зачем же тогда создавать иллюзию универсальности если правила обработки фиксированы и предопределены.
Я бы данную структуру данных преобразовал бы в список классов (List = new List(Types::Class)) поместил бы этот список в класс обёртку, который бы контролировал типы хранящихся в списке значений. Для представления элементов списка сделал бы иерархию классов: Базовый класс представляет общий интерфейс для формирования вкладки, а его наследники реализуют каждый конкретный способ организации вкладки. Для удобства использования можно добавить статические методы, создающие экземпляры необходимых классов. После всего этого привидённый вами код мог бы выглядеть например так
X++:
Lookup = new Lookup();
Lookup.addTab(Lookup::newdatasource(tablenum(InventTable), fieldnum(InventTable, ItemName));
Lookup.addTab(Lookup::newdatasourcequery(tablenum(InventTable), query.pack(), fieldnum(InventTable, ItemId));
Lookup.addTab(Lookup::newdatasourcetmp(tablenum(anytable), anytable, fieldnum(anytable, anyfield));
Lookup.parmCaller(this);
Lookup.run();
Конечнор всё это требует глобального перестроения существующей архитектуры. Если оставлять существующую архитктуру решения, то можно по крайней мере заменить контейнер на чтонибудь более гибкое. Например Struct
X++:
List param = new List(Types::Class);
Struct Struct;
Struct = new Struct();
Struct.add("type", "newdatasource");
Struct.add("tablenum", tablenum(InventTable));
Struct.add("fieldnum", fieldnum(InventTable, ItemName));
List.addEnd(Struct);
Struct = new Struct();
Struct.add("type", "newdatasourcequery");
Struct.add("tablenum", tablenum(InventTable));
Struct.add("query", query);
Struct.add("fieldnum", fieldnum(InventTable, ItemId));
List.addEnd(Struct);
Struct = new Struct();
Struct.add("type", "newdatasourcetmp");
Struct.add("tablenum", tablenum(anytable));
Struct.add("cursor", anytable);
Struct.add("fieldnum", fieldnum(anytable, anyfield));
List.addEnd(Struct);
Lookup::run(param, this);
P.S.: О способах структурирования данных интересная ветка есть
Как правильно хранить статичный набор начальных данных в классах?