private ISpecification <IEnumerable <Condition <TConditionType> > > BuildSpecification(IConditionNode <TConditionType> conditionNode, MatchModes matchMode)
 {
     return(conditionNode switch
     {
         IValueConditionNode <TConditionType> valueConditionNode => this.BuildSpecificationForValueNode(valueConditionNode, matchMode),
         ComposedConditionNode <TConditionType> composedConditionNode => this.BuildSpecificationForComposedNode(composedConditionNode, matchMode),
         _ => throw new NotSupportedException($"Unsupported condition node: '{conditionNode.GetType().Name}'."),
     });
 public Func <IEnumerable <Condition <TConditionType> >, bool> GetDeferredEvalFor <TConditionType>(IValueConditionNode <TConditionType> valueConditionNode, MatchModes matchMode)
 {
     return(valueConditionNode switch
     {
         IntegerConditionNode <TConditionType> integerConditionNode => (conditions) => Eval <IntegerConditionNode <TConditionType>, TConditionType, int>(conditions, integerConditionNode, matchMode),
         DecimalConditionNode <TConditionType> decimalConditionNode => (conditions) => Eval <DecimalConditionNode <TConditionType>, TConditionType, decimal>(conditions, decimalConditionNode, matchMode),
         StringConditionNode <TConditionType> stringConditionNode => (conditions) => Eval <StringConditionNode <TConditionType>, TConditionType, string>(conditions, stringConditionNode, matchMode),
         BooleanConditionNode <TConditionType> booleanConditionNode => (conditions) => Eval <BooleanConditionNode <TConditionType>, TConditionType, bool>(conditions, booleanConditionNode, matchMode),
         _ => throw new NotSupportedException($"Unsupported value condition node: '{valueConditionNode.GetType().Name}'."),
     });