예제 #1
0
        /// <summary>Метод генерации события посещения узла произвольного типа</summary>
        /// <typeparam name="TElement">Тип узла дерева</typeparam><typeparam name="TOut">Тип выходного узла</typeparam>
        /// <param name="Handlers">Событие</param>
        /// <param name="Node">Посещённый узел дерева</param>
        /// <param name="Base">Базовый метод обработки узла</param>
        /// <returns>Узел, которым надо заместить посещённый узел дерева</returns>
        private TOut InvokeEvent <TElement, TOut>(EventHandlerReturn <EventArgs <TOut>, TOut> Handlers, TElement Node, Func <TElement, TOut> Base)
        {
            // Если обработчиков события нет, то вызываем базовый метод и возвращаем результат
            var element = Base(Node); // Вызываем базовый метод для получения замены

            if (Handlers is null)
            {
                return(element);
            }
            // Генерируем событие с передачей в него узла, полученного от базового дерева
            return(Handlers(this, new EventArgs <TOut>(element)));
        }
예제 #2
0
        /// <summary>Метод генерации события посещения узла типа Expression</summary>
        /// <typeparam name="TExpressionNode">Тип узла дерева</typeparam>
        /// <param name="Handlers">Событие</param>
        /// <param name="Node">Узел дерева</param>
        /// <param name="Base">Базовый метод обработки узла</param>
        /// <returns>Узел, которым надо заместить посещённый узел дерева</returns>
        private Expression InvokeEvent <TExpressionNode>(EventHandlerReturn <EventArgs <TExpressionNode>, Expression> Handlers, TExpressionNode Node, Func <TExpressionNode, Expression> Base)
            where TExpressionNode : Expression
        {
            // Если обработчиков события нет, то вызываем базовый метод и возвращаем результат
            var element = Base(Node); // Вызываем базовый метод для получения замены

            if (Handlers is null)
            {
                return(element);
            }
            var node = element as TExpressionNode;

            return(node != null
                ? Handlers(this, new EventArgs <TExpressionNode>(node))
                : element); // иначе возвращаем элемент, от базового метода
        }