Короткий ответ: не .
Метод должен иметь известный, определенный тип возвращаемого значения. Этот тип может быть System.Object
, но тогда вам придется использовать много уродливого кода отражения, чтобы получить членов. И в этом случае вам также придется использовать много уродливого отражения кода дерева выражений для генерации возвращаемого значения.
Если вы пытаетесь динамически генерировать столбцы на стороне пользовательского интерфейса - прекратите это делать. Определите столбцы во время разработки, а затем просто отобразите / скройте столбцы, которые вам действительно нужны / которые хочет видеть пользователь. Пусть ваш запрос вернет все столбцы, которые могут быть видны.
Если вы не заметите серьезной проблемы с производительностью, выбирая все столбцы данных (в этом случае у вас, вероятно, возникают проблемы с индексами на уровне базы данных, которые не покрываются), вам будет гораздо лучше с этим подходом. Вполне нормально генерировать предикаты и порядок сортировки динамически, но вы действительно не хотите делать это со списком вывода.
Некоторые комментарии заставили меня серьезно задуматься о том, был ли я прав в своем предположении, что динамический список вывода на самом деле возможен , и я пришел к выводу, что это так, несмотря на то, что это опасно Плавание против текущей идеи. Чтобы выполнить этот трюк, вам необходимо:
- Создать новый тип, используя Reflection.Emit .
- Создание дерева выражений, которое инициализирует его, используя Expression.MemberInit .
- Скомпилируйте выражение и передайте его методу
Select
.
- Верните слабо набранный
System.Object
из вашего метода и используйте Reflection для доступа к членам по имени.
Это не та вещь, которую я когда-либо хотел бы видеть в рабочем коде, но у вас это есть - это возможно.