protected virtual IFollowingActionSearchConditionBuilder <TBuilder, TResult> Block(Action <TBuilder> builder) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } SearchConditionBlockItem <TResult> item = null; var exceptionIsThrown = false; _builderContexts.Push(_currentBuilderContext); try { _currentBuilderContext = null; builder(this as TBuilder); item = _currentBuilderContext != null?CreateBlockItem(_currentBuilderContext) : null; } catch { exceptionIsThrown = true; throw; } finally { _currentBuilderContext = _builderContexts.Pop(); if (!exceptionIsThrown && item != null) { CurrentBuilderContext.Add(item); } } return((TBuilder)this); }
protected abstract SearchConditionBlockItem <TResult> CreateBlockItem(SearchConditionBuilderContext <TResult> blockBuilderContext);
protected SearchConditionBlockItem(SearchConditionBuilderContext <TResult> blockBuilderContext) { BlockBuilderContext = blockBuilderContext ?? throw new ArgumentNullException(nameof(blockBuilderContext)); }