/
ivanstrike
/
tasker
Обзор
Документация
Войти
/
ivanstrike
/
tasker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Helpers/FieldSelector.cs
90 строк
3 KB
ivanstrike
Лабораторная работа 2
08 ноя 2025, 11:16
08 ноя 2025, 11:16
ec39293
Код
Авторство
О чём код?
using System.Dynamic; using System.Reflection; using System.Text.Json; namespace TaskerApi.Helpers; /// <summary> /// Утилита для выборочного включения полей в ответ API /// </summary> public static class FieldSelector { /// <summary> /// Фильтрует объект, оставляя только запрошенные поля /// </summary> /// <param name="source">Исходный объект</param> /// <param name="fields">Список полей для включения (через запятую)</param> /// <returns>Объект с выбранными полями</returns> public static object? SelectFields(object? source, string? fields) { if (string.IsNullOrWhiteSpace(fields) || source == null) { return source; } var fieldList = fields.Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(f => f.Trim().ToLowerInvariant()) .ToHashSet(); if (fieldList.Count == 0) { return source; } var sourceType = source.GetType(); var properties = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance); var result = new ExpandoObject() as IDictionary<string, object?>; foreach (var prop in properties) { var propName = prop.Name; var propNameLower = propName.ToLowerInvariant(); if (fieldList.Contains(propNameLower)) { var value = prop.GetValue(source); result[propName] = value; } } return result; } /// <summary> /// Фильтрует коллекцию объектов, оставляя только запрошенные поля /// </summary> public static IEnumerable<object?> SelectFields<T>(IEnumerable<T> source, string? fields) { if (string.IsNullOrWhiteSpace(fields)) { return source.Cast<object?>(); } return source.Select(item => SelectFields(item, fields)); } /// <summary> /// Применяет фильтрацию полей к пагинированному результату /// </summary> public static object SelectFieldsFromPaginated<T>(Models.PaginatedResult<T> source, string? fields) { if (string.IsNullOrWhiteSpace(fields)) { return source; } var filteredItems = SelectFields(source.Items, fields).ToList(); return new { Items = filteredItems, source.Page, source.PageSize, source.TotalCount, source.TotalPages, source.HasPrevious, source.HasNext }; } }