We all know that when writing software, re-use is of importance to get the most out of the time we have. When we apply this to object collections, we should be aiming to write collection agnostic code that can be used over and over again. For example, when we use a collection of say User objects, we should be able to give it the same operation as we give a collection of Car objects. The operation that we pass to the collection shouldn't care if the collection has cars, users or elephants. It just knows how to perform its operation.
I stumbled on a great article recently on sorting object collections using reflection. The
PropertySorter would be passed to the sort method of any strongly typed collection and would sort it depending on the values passed. Doing the same thing with filtering was therefore my aim: to be able to have a strongly typed collection that would implement an
IFilterable interface and take in a
Reflective Filter Features
The features of the
ReflectiveFilter are as follows:
- Use the
FilterOperand to decide if you want to place
Or between the
- Use the
FilterClause to decide if you want to place a
IsNotEqualTo in the filter criteria.
- Add as many filters as you like using the
AddFilter method of the
Using the code
To use the
ReflectiveFilter is easy. Simply instantiate a new instance of the filter, add the filters you need, and the
Filter method will pass back a strongly typed collection that is filtered on your requirements.
Example: We have a collection of names and IDs and want to filter it so we only get back names that are equal to Phil or Richard.
ReflectiveFilter rFilter = new
ACollectionType filteredCollection = new NameIdReferenceCollection();
filteredCollection = nameIdReferenceCollection.Filter(rFilter);
As you can see from the example, we pass in up to four parameters.
type of object contained in the collection you are filtering (required).
type of collection being filtered (required).
FilterClause (optional / defaults to
FilterOperand (optional / defaults to
FilterClause can be set to either
IsNotEqualTo and defaults to
FilterOperand can be set to either
And, and defaults to
Or. The job of the
FilterOperand is when we have more than one filter applied, to either specify that we need to look for (for example) records where Parameter=Value
The default constructor accepts just two parameters:
typeOfObject: The type of object that is contained in the collection we are filtering.
typeOfCollection: The type of collection that is being filtered.
ReflectiveFilter seems to perform quickly and because it is collection agnostic, means that most other requirements for custom filters are not needed.