Ejemplo n.º 1
0
        /// <devdoc>
        ///     This is the last stage in our filtering pipeline.  Here, we apply any
        ///     user-defined filter.  
        /// </devdoc>
        private static ICollection PipelineAttributeFilter(int pipelineType, ICollection members, Attribute[] filter, object instance, IDictionary cache)
        {
            Debug.Assert(pipelineType != PIPELINE_ATTRIBUTES, "PipelineAttributeFilter is not supported for attributes");
            
            IList list = members as ArrayList;

            if (filter == null || filter.Length == 0)
            {
                return members;
            }

            // Now, check our cache.  The cache state is only valid
            // if the data coming into us is read-only.  If it is read-write,
            // that means something higher in the pipeline has already changed
            // it so we must recompute anyway.
            //
            if (cache != null && (list == null || list.IsReadOnly))
            {
                AttributeFilterCacheItem filterCache = cache[_pipelineAttributeFilterKeys[pipelineType]] as AttributeFilterCacheItem;
                if (filterCache != null && filterCache.IsValid(filter))
                {
                    return filterCache.FilteredMembers;
                }
            }

            // Our cache did not contain the correct state, so generate it.
            //
            if (list == null || list.IsReadOnly)
            {
                Trace("Pipeline : Filter needs to create member list for {0}", instance.GetType().Name);
                list = new ArrayList(members);
            }

            ArrayList filterResult = FilterMembers(list, filter);
            if (filterResult != null) list = filterResult;

            // And, if we have a cache, store the updated state into it for future reference.
            //
            if (cache != null)
            {
                ICollection cacheValue;

                switch(pipelineType)
                {
                    case PIPELINE_PROPERTIES:
                        PropertyDescriptor[] propArray = new PropertyDescriptor[list.Count];
                        list.CopyTo(propArray, 0);
                        cacheValue = new PropertyDescriptorCollection(propArray, true);
                        break;

                    case PIPELINE_EVENTS:
                        EventDescriptor[] eventArray = new EventDescriptor[list.Count];
                        list.CopyTo(eventArray, 0);
                        cacheValue = new EventDescriptorCollection(eventArray, true);
                        break;

                    default:
                        Debug.Fail("unknown pipeline type");
                        cacheValue = null;
                        break;
                }

                Trace("Pipeline : Attribute Filter results being cached for {0}", instance.GetType().Name);
                AttributeFilterCacheItem filterCache = new AttributeFilterCacheItem(filter, cacheValue);
                cache[_pipelineAttributeFilterKeys[pipelineType]] = filterCache;
            }

            return list;
        }
 private static ICollection PipelineAttributeFilter(int pipelineType, ICollection members, Attribute[] filter, object instance, IDictionary cache)
 {
     IList list = members as ArrayList;
     if ((filter == null) || (filter.Length == 0))
     {
         return members;
     }
     if ((cache != null) && ((list == null) || list.IsReadOnly))
     {
         AttributeFilterCacheItem item = cache[_pipelineAttributeFilterKeys[pipelineType]] as AttributeFilterCacheItem;
         if ((item != null) && item.IsValid(filter))
         {
             return item.FilteredMembers;
         }
     }
     if ((list == null) || list.IsReadOnly)
     {
         list = new ArrayList(members);
     }
     ArrayList list2 = FilterMembers(list, filter);
     if (list2 != null)
     {
         list = list2;
     }
     if (cache != null)
     {
         ICollection is2;
         switch (pipelineType)
         {
             case 1:
             {
                 PropertyDescriptor[] array = new PropertyDescriptor[list.Count];
                 list.CopyTo(array, 0);
                 is2 = new PropertyDescriptorCollection(array, true);
                 break;
             }
             case 2:
             {
                 EventDescriptor[] descriptorArray2 = new EventDescriptor[list.Count];
                 list.CopyTo(descriptorArray2, 0);
                 is2 = new EventDescriptorCollection(descriptorArray2, true);
                 break;
             }
             default:
                 is2 = null;
                 break;
         }
         AttributeFilterCacheItem item2 = new AttributeFilterCacheItem(filter, is2);
         cache[_pipelineAttributeFilterKeys[pipelineType]] = item2;
     }
     return list;
 }