Анонимные типы по самой своей природе не могут быть явно "объявлены". Они анонимны, неизвестны; у вас нет типа для объявления. Таким образом, анонимные типы, будь то напрямую или в качестве параметра универсального типа, не могут быть указаны в качестве параметров, использованы в качестве возвращаемого типа или сохранены в какой-либо явно типизированной переменной. Вы должны использовать var
для их назначения, а это означает, что вы в значительной степени ограничены использованием типа в локальной области видимости.
Ваша единственная возможность, по сути, состоит в том, чтобы преобразовать ваш анонимный тип в собранный тип, который может быть явно объявлен (то есть вы должны объявить сам тип). Просто создайте простой класс DTO и перед вызовом ToList запустите анонимный тип через узел Linq Select (), который использует анонимный тип для инициализации вашего сильного класса.
Если вы используете .NET 4.0, вы МОЖЕТЕ пойти dynamic
. Ключевое слово dynamic
и любой объект, который был передан через параметр или возвращаемый тип, объявленный dynamic
, в основном говорят компилятору не пытаться проверять какие-либо операции над ним; Вы можете попытаться использовать любой оператор, вызвать любой метод и т. д. ОДНАКО, если оператор, член или любая другая выполняемая вами операция недопустима для объекта, который на самом деле находится за кадром, вы получите исключения времени выполнения, которые Вы должны обращаться очень крепко. По этой причине, dynamic
функция .NET 4.0 не должна использоваться слегка.
Единственное, что вы можете сделать, как сказал Кратц, - это вернуть ArrayList или массив Object [] и использовать отражение, чтобы обнаружить структуру анонимного типа. Это нет-нет, во всяком случае, вы можете нарезать его; вы теряете строгую типизацию коллекции, ваш код значительно раздувается, так как вам требуется несколько строк кода для выполнения даже самых простых операций get или set, и отражение, опять же по своей природе, может быть в 100 раз медленнее, чем эквивалентная операция над известный статический тип.