public static IEnumerable <T> FindMatches <T>(IEnumerable <T> items, string searchText)
    {
        if (typeof(T) == typeof(string))
        {
            var searchTerms = SearchTerm.ExtractAllTerms(searchText);
            foreach (var item in items)
            {
                var itemMatches = true;
                foreach (var searchTerm in searchTerms)
                {
                    var searchMatch = searchTerm.MatchesAgainst(item as string);
                    if (!searchMatch)
                    {
                        itemMatches = false;
                        break;
                    }
                }

                if (itemMatches)
                {
                    yield return(item);
                }
            }

            yield break;
        }

        var itemProps = GetProperties(typeof(T));

        foreach (var obj in items)
        {
            if (Search(itemProps, obj, searchText))
            {
                yield return(obj);
            }
        }
    }