private MemberCacheDescriptor MergeDescriptorsUsingOr(IEnumerable<MemberCacheDescriptor> descriptors)
        {
            var result = new MemberCacheDescriptor();
              foreach (var descriptor in descriptors)
              {
            result.BindingFlags |= descriptor.BindingFlags;
            result.MemberTypes |= descriptor.MemberTypes;
            if (result.Type == null && descriptor.Type != null)
              result.Type = descriptor.Type;
            else if(descriptor.Type!=null)
              throw new ArgumentException("Can't filter by multiple types");
            if (!string.IsNullOrEmpty(descriptor.Name) && string.IsNullOrEmpty(result.Name))
              result.Name = descriptor.Name;
            else if (!string.IsNullOrEmpty(descriptor.Name))
              throw new ArgumentException("Can't filter by multiple names");
              }

              return result;
        }
        private MemberCacheDescriptor ToDescriptor(Filter filter)
        {
            var result = new MemberCacheDescriptor();
              switch (filter.FilterBy)
              {
            case FilterBy.BindingFlags:
              result.BindingFlags = filter.BindingFlags;
              break;
            case FilterBy.Name:
              result.Name = filter.Name;
              break;
            case FilterBy.Type:
              result.Type = filter.Type;
              break;
            case FilterBy.MemberType:
              result.MemberTypes = filter.MemberTypes;
              break;
            default:
              throw new ArgumentOutOfRangeException();
              }

              return result;
        }
 private MemberCacheDescriptor MergeDescriptorsUsingAnd(IEnumerable<MemberCacheDescriptor> descriptors)
 {
     var result = new MemberCacheDescriptor();
       foreach (var descriptor in descriptors)
       {
     result.BindingFlags = MergeFlags(result.BindingFlags, descriptor.BindingFlags);
     if (descriptor.MemberTypes != MemberTypes.All && result.MemberTypes == MemberTypes.All)
       result.MemberTypes = descriptor.MemberTypes;
     else if (descriptor.MemberTypes != MemberTypes.All)
       result.MemberTypes = ~MemberTypes.All;
     if (!string.IsNullOrEmpty(descriptor.Name) && string.IsNullOrEmpty(result.Name))
       result.Name = descriptor.Name;
     else if (!string.IsNullOrEmpty(descriptor.Name))
       throw new ArgumentException("Mutually exclusive conditions for Name");
     if (descriptor.Type !=null && result.Type == null)
       result.Type = descriptor.Type;
     else if (descriptor.Type != null)
       throw new ArgumentException("Mutually exclusive conditions for Type");
       }
       return result;
 }