static public List <string> GetFiltersWheres <TFilters>(TFilters Filters) where TFilters : new() { // TODO a way to exclude some Filters[something] from this mapping // TODO check if all filters are parsed // TODO check if Filters[something] is a prop of TEntity (otherwise skip/throw) List <string> filtersWheres = new(); // TODO improve readability this "filter" is everywhere and is unclear what it means PropertyInfo[] filtersProperties = typeof(TFilters).GetProperties(); foreach (var filterProperty in filtersProperties) { // Filters[prop] type LIST Filter<Int/String/Date> var singleFilterList = filterProperty.GetValue(Filters); // STRING FilterStringDto if (singleFilterList is List <FilterStringDto> stringFilters) { foreach (var filterString in stringFilters) { var filter = new StringFilter { EntityProperty = filterProperty.Name, Comparison = filterString.Comparison, Value = filterString.Value, }; filtersWheres.Add(filter.ToSql()); } } // INT FilterIntDto else if (singleFilterList is List <FilterIntDto> intFilters) { foreach (var intFilter in intFilters) { var filter = new IntFilter { EntityProperty = filterProperty.Name, Comparison = intFilter.Comparison, Value = intFilter.Value, }; filtersWheres.Add(filter.ToSql()); } } // DATE FilterDateDto else if (singleFilterList is List <FilteDateDto> dateFilters) { foreach (var dateFilter in dateFilters) { var filter = new DateFilter { EntityProperty = filterProperty.Name, Comparison = dateFilter.Comparison, Value = dateFilter.Value, }; filtersWheres.Add(filter.ToSql()); } } } return(filtersWheres); }