Как правильно работать с Террасофтом из С#

Здравствуйте!

Код из стандартного скрипта scr_DB:

function EnableFilter(FiltersNode, FilterCode, Enabled) {
        CheckAssigned(FiltersNode, 'Filter');
        if (FiltersNode.Code == FilterCode) {
                FiltersNode.IsEnabled = Enabled;
                // Enable all included filters
                EnableAllFilters(FiltersNode, Enabled);
                return true;
        }
        var Result = false;
        if (FiltersNode.FilterType == ftFilters) {
                for (var i = 0; (i FiltersNode.Count) && (!Result); i++) {
                        Result = EnableFilter(FiltersNode.Items(i), FilterCode, Enabled);
                }
                if (Result && Enabled) {
                        FiltersNode.IsEnabled = true;
                }
        }  else
        if ((Assigned(FiltersNode.TestExpression)) &&
                (FiltersNode.TestExpression.ExpressionType == fetSelect)) {
                EnableSelectQueryFilters(
                        FiltersNode.TestExpression.ExpressionSelectQuery, Enabled,
                        new Array(FilterCode));
        }
        return Result;
}

Здесь, FiltersNode - это набор фильтров с типом IFilters
Тем не менее, из скрипта возможно обращение вида
FiltersNode.Code == FilterCode

На С# подобное обращение невозможно, поскольку при явном указании типа IFilters у FiltersNode отсутствует свойство Code. Привести же FiltersNode к типу IFilter тоже не получается, поскольку интерфейс IFilter не поддерживается, что логично, поскольку это все же коллекция ( что подтверждает вызов FiltersNode.Items(i))

Разъясните пожалуйста, как я могу переписать указанную функцию на С#.

Нравится

4 комментария

Pavel, JScript - нетипизированный язык, поэтому в скрипте можно прописать:

FiltersNode.Code == FilterCode

В случае С# необходимо проверять тип FiltersNode. Если FiltersNode соответсвует фильтру (а не группе фильтров) - выполнять требуемую логику.

Прокомментируйте, пожалуйста, почему вот этот код http://www.community.terrasoft.ru/blogs/6354 не работает в моей версии Террасофта 3.4.0.134.
Ошибка

Для типа "TSObjectLibrary.ConnectorClass" не определен конструктор	

Если заглянуть в описание библиотеки, то TSObjectLibrary.ConnectorClass.ConnectorClass() (конструктор?) присутствует.
Спасибо.

Павел, код работает в 3.4.0.
Если класс не определен, значит некорректно импортирован в проект C# reference TSObjectLibrary.dll либо что-то не так со сгенерированным wrapper’ом.
Попробуйте использовать пример из вложения (загрузка валют с сайта ЦБР), созданный и протестированный Алексеем Агутиным. В примере для подключения используется DSKConnector.

Наталья, спасибо большое за помощь, во всем разобрался.
Касательно конструктора - неверно были настроены references.
Если говорить вот об этом

FiltersNode.Code == FilterCode

То да, необходима проверка вида

if (FiltersNode is IFilter)
Показать все комментарии