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; }