У меня есть запрос, который возвращает анонимный тип, и запрос находится в методе. Как это написать:
public "TheAnonymousType" TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select new { SomeVariable = ....,
AnotherVariable = ....}
).ToList();
return "TheAnonymousType";
}
}
c#
.net
anonymous-types
return-type
француженка
источник
источник
Ответы:
Вы не можете.
Вы можете только вернуть
object
или контейнер с объектами, напримерIEnumerable<object>
,IList<object>
и т. Д.источник
dynamic
. Это значительно упрощает работу.Вы можете вернуть,
dynamic
что даст вам версию анонимного типа, проверенную во время выполнения, но только в .NET 4+источник
В C # 7 для этого можно использовать кортежи:
Однако вам может потребоваться установить
System.ValueTuple
пакет nuget.источник
Вы не можете возвращать анонимные типы. Можете ли вы создать модель, которую можно вернуть? В противном случае вы должны использовать
object
.Вот статья, написанная Джоном Скитом на эту тему.
Код из статьи:
Или вот еще одна похожая статья
Или, как комментируют другие, вы можете использовать
dynamic
источник
Вы можете использовать класс Tuple как замену анонимным типам, когда требуется возврат:
Примечание. Кортеж может иметь до 8 параметров.
Или, например, из исходного сообщения:
http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx
источник
Компилятор C # - это двухфазный компилятор. На первом этапе он просто проверяет пространства имен, иерархии классов, сигнатуры методов и т. Д. Тела методов компилируются только на втором этапе.
Анонимные типы не определяются, пока тело метода не скомпилировано.
Таким образом, компилятор не имеет возможности определить тип возвращаемого значения метода на первом этапе.
По этой причине анонимные типы не могут использоваться в качестве возвращаемого типа.
Как предлагали другие, если вы используете .net 4.0 или терку, вы можете использовать
Dynamic
.На вашем месте я, вероятно, создал бы тип и вернул бы этот тип из метода. Таким образом, будущим программистам будет проще поддерживать ваш код и сделать его более читабельным.
источник
Три варианта:
Опция 1:
Вариант 2:
вы можете повторять его как объект
Вариант 3:
и вы сможете повторять его как динамический объект и напрямую обращаться к его свойствам
источник
В этом случае вы можете вернуть список объектов.
источник
Используя C # 7.0, мы по-прежнему не можем возвращать анонимные типы, но у нас есть поддержка типов кортежей, и поэтому мы можем вернуть коллекцию
tuple
(System.ValueTuple<T1,T2>
в данном случае). В настоящее времяTuple types
не поддерживаются в деревьях выражений, и вам необходимо загружать данные в память.Самый короткий вариант кода, который вам нужен, может выглядеть так:
Или используя свободный синтаксис Linq:
Используя C # 7.1, мы можем опустить имена свойств кортежа, и они будут выведены из инициализации кортежа, как это работает с анонимными типами:
источник
Создание собственного класса и запрос к нему - лучшее решение, которое я знаю. Насколько я знаю, вы не можете использовать возвращаемые значения анонимного типа в другом методе, потому что он не будет просто распознан. Однако их можно использовать в том же самом методе. метод. Раньше я возвращал их как
IQueryable
илиIEnumerable
, хотя он по-прежнему не позволяет увидеть, что находится внутри переменной анонимного типа.Я сталкивался с чем-то подобным раньше, когда пытался реорганизовать какой-то код, вы можете проверить это здесь: Рефакторинг и создание отдельных методов
источник
С отражением.
Образец:
Вывод:
источник
Вы можете использовать только динамическое ключевое слово,
Но с ключевым словом динамического типа вы потеряете безопасность времени компиляции, IDE IntelliSense и т. Д.
источник
Другой вариант - использовать automapper: вы будете преобразовывать анонимный возвращенный объект в любой тип, если совпадают общедоступные свойства. Ключевые моменты: возврат объекта, использование linq и autommaper. (или используйте аналогичную идею, возвращающую сериализованный json и т.д., или используйте отражение ..)
источник
Теперь особенно с локальными функциями, но вы всегда можете сделать это, передав делегат, который создает анонимный тип.
Итак, если вашей целью было запустить разную логику для одних и тех же источников и иметь возможность объединить результаты в один список. Не уверен, какой нюанс отсутствует для достижения заявленной цели, но пока вы возвращаете a
T
и передаете делегат для makeT
, вы можете вернуть анонимный тип из функции.источник
Фактически возможно вернуть анонимный тип из метода в конкретном случае использования. Давайте посмотрим!
В C # 7 можно возвращать анонимные типы из метода, хотя это имеет небольшое ограничение. Мы собираемся использовать новую языковую функцию, называемую локальной функцией, вместе с трюком косвенного обращения (другой уровень косвенного обращения может решить любую проблему программирования, верно?).
Вот пример использования, который я недавно обнаружил. Я хочу регистрировать все значения конфигурации после их загрузки из
AppSettings
. Зачем? Потому что есть некоторая логика вокруг пропущенных значений, которые возвращаются к значениям по умолчанию, некоторому синтаксическому анализу и так далее. Простой способ записать значения после применения логики - это поместить их все в класс и сериализовать в файл журнала (с помощью log4net). Я также хочу инкапсулировать сложную логику работы с настройками и отделить ее от всего, что мне нужно с ними делать. И все это без создания именованного класса, который существует только для одноразового использования!Давайте посмотрим, как решить эту проблему с помощью локальной функции, которая создает анонимный тип.
Мне удалось построить анонимный класс, а также инкапсулировать логику работы со сложным управлением настройками внутри
CreateHttpClient
и внутри своего собственного «выражения». Возможно, это не совсем то, что хотел OP, но это легкий подход с анонимными типами, который в настоящее время возможен в современном C #.источник