Herman<T>.Instance Ответов: 2

Универсальный класс C# linq


Привет Друзья,

В универсальном классе я хочу сортировать свои данные из webAPI.
У меня есть переменная в этом классе, которая содержит имя поля сортировки по умолчанию в коллекции свойств.

Как бы я ни старался, данные не сортируются.

Мой код:
IOrderedEnumerable<T> data;
                if (!string.IsNullOrEmpty(DropDownListDataTextField))
                    data = dataservice.OrderBy(x => x.GetType().GetProperty(DropDownListDataTextField));
                else
                    data = dataservice as IOrderedEnumerable<T>;
                ddl.DataSource = data;
                ddl.DataTextField = OtherDataTextField ?? DropDownListDataTextField;
                ddl.DataValueField = "Id";
                ddl.DataBind();


При отладке детали
x => x.GetType().GetProperty(DropDownListDataTextField)
приводит к нулевому значению

Что я уже пробовал:

Как я могу решить эту проблему? Значение поля ("Статус") в DropDownListDataTextField является свойством в коллекции данных webAPI.

2 Ответов

Рейтинг:
9

Maciej Los

Короче говоря: ваш класс должен реализовать IComparable интерфейс. Видеть: Интерфейс Icomparable (Системы) | Майкрософт Документы[^]


Herman&lt;T&gt;.Instance

Я действительно прочитал это решение и нашел
https://stackoverflow.com/questions/3309188/how-to-sort-a-listt-by-a-property-in-the-object как простой ответ. Вариант, который дал Грифф, имеет минимальный код.
Спасибо за вашу помощь!

Maciej Los

Всегда пожалуйста.

Рейтинг:
19

OriginalGriff

Мы не можем сказать, потому что у нас нет доступа к вашим данным, и именно это контролирует задание с обеих сторон. if заявление.
Я бы начал с того, что использовал отладчик, чтобы посмотреть на содержимое dataservice и выяснить, что именно это такое и какие типы в нем содержатся.
Затем проверьте, с какой стороны, если if...else выполняется, и либо посмотрите очень внимательно на содержимое данных, либо на тип данных dataservice.
Если это тот самый else сторона, тогда я бы предположил, что все равно dataservice содержит либо то, либо другое null или не является экземпляром а IOrderedEnumerable<T> (какой бы класс ни был T случается, что это происходит во время выполнения).
Если это тот самый if сторона, то содержание коллекции является определяющими данными.

Извините, но мы не можем сделать ничего из этого для вас - у нас нет никакого доступа к вашему коду, пока он работает!


Herman&lt;T&gt;.Instance

Грифф, я знаю, что сегодня утро понедельника.

Я сделал отладку, и я знаю, что это если, а не другая часть, которую он запускает.....

OriginalGriff

Итак, что же показывал отладчик в этих данных?

Herman&lt;T&gt;.Instance

НУЛЕВОЙ
но колонна существует.
Я добавил .И getValue(датасервис), а затем я получаю сообщение об ошибке:
параметр "this" не является экземпляром типа

данные var имеют ошибку: объект не соответствует целевому типу.

OriginalGriff

Да, но что это за тип? И какую строку содержит DropDownListDataTextField?
Если GetType возвращает тип, у которого нет свойства, соответствующего искомому имени, то сортировка будет просто сравнивать нулевые значения.

Herman&lt;T&gt;.Instance

<t> - это объект webAPI ModelStatu (это таблица через EF в контроллере webAPI).
DropDownListDataTextField содержит имя для отображения в раскрывающемся списке и имеет значение "Status"

OriginalGriff

Хммм. Так что же такое GetType returning?

Herman&lt;T&gt;.Instance

{System.Linq.OrderedEnumerable<marinmodelservice.models.modelstatu, system.type="">}

служба данных.OrderBy(x => x.GetType().GetProperty(DropDownListDataTextField)) приводит к неупорядоченному IeNumerable<t>

lmoelleb

Подсказка о том, как отлаживать: поместите точку останова внутри лямбды (поэтому вызов x.GetType()...)
Как только он попадет, попробуйте запустить x.GetType().GetProperty(...) в промежуточном окне Visual studio. Наблюдайте за данными, которые он возвращает. Это будет не то, что вы ожидаете....

Herman&lt;T&gt;.Instance

Я так и сделал, но вопрос решен. Спасибо

OriginalGriff

И System.Linq.OrderedEnumerable не имеет свойства Status ...
Так что же вы ожидали, что dataservice будет повторять?

И... вы собирались писать

x.GetType().GetProperty(DropDownListDataTextField).GetValue(x)

Herman&lt;T&gt;.Instance

Спасибо, Приятель!

Я же сказал, что сегодня утро понедельника.....

OriginalGriff

Он взял меня достаточно долго, чтобы заметить, что сам! :смеяться: