/// <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))); }
/// <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); // иначе возвращаем элемент, от базового метода }