Exemplo n.º 1
0
        /// <summary>
        /// 問い合わせ元が所有者の子なら親の回答を、それ以外なら子の回答の OR を返します。
        /// </summary>
        /// <param name="item">適合するか確認する対象</param>
        /// <param name="inquirySource">問い合わせ元</param>
        /// <returns>適合する場合 true、しない場合 false</returns>
        public override bool Match(T item, object inquirySource)
        {
            if (this._Owner == null)
            {
                throw new InvalidOperationException("所有者が設定されていません。");
            }

            IHierarchicalFilter <T> owner = (IHierarchicalFilter <T>) this._Owner;

            if (inquirySource != null &&
                inquirySource is IHierarchicalFilter <T> &&
                owner.IsSubFilter((IHierarchicalFilter <T>)inquirySource)
                )
            {
                if (owner.IsRoot)
                {
                    return(true);
                }
                else
                {
                    return(owner.Parent.Match(item, inquirySource));
                }
            }

            if (!owner.IsRoot && !owner.Parent.Match(item, inquirySource))
            {
                return(false);
            }

            // 既定の戻り値。
            bool result = false;

            foreach (IHierarchicalFilter <T> child in owner.Children)
            {
                if (!(child.Filter is ResudueFilter <T>) && child.Filter.Match(item, inquirySource))
                {
                    result = true;
                    break;
                }
            }
            return(result);
        }