Объявление переменной LIST анонимного типа в C # - PullRequest
2 голосов
/ 09 августа 2011

Я работаю с LINQ to SQL с ASP.NET 4 и C #. Я создал запрос LINQ, который приводит к новому списку (т.е. ToList ()). Возвращенный LIST имеет тип ANONYMOUS, потому что он создается динамически запросом. Я хочу иметь возможность объявить переменную на уровне страницы в коде, чтобы я мог использовать ее в других функциях, а также на первой странице, используя '<% =%>'.

Visual Studio сообщает мне, что результат имеет анонимный тип, но дает мне имена классов, например: {CLASS1, CLASS2}.

Как я могу объявить переменную этого анонимного типа?

Ответы [ 3 ]

1 голос
/ 09 августа 2011

Анонимные типы по самой своей природе не могут быть явно "объявлены". Они анонимны, неизвестны; у вас нет типа для объявления. Таким образом, анонимные типы, будь то напрямую или в качестве параметра универсального типа, не могут быть указаны в качестве параметров, использованы в качестве возвращаемого типа или сохранены в какой-либо явно типизированной переменной. Вы должны использовать var для их назначения, а это означает, что вы в значительной степени ограничены использованием типа в локальной области видимости.

Ваша единственная возможность, по сути, состоит в том, чтобы преобразовать ваш анонимный тип в собранный тип, который может быть явно объявлен (то есть вы должны объявить сам тип). Просто создайте простой класс DTO и перед вызовом ToList запустите анонимный тип через узел Linq Select (), который использует анонимный тип для инициализации вашего сильного класса.

Если вы используете .NET 4.0, вы МОЖЕТЕ пойти dynamic. Ключевое слово dynamic и любой объект, который был передан через параметр или возвращаемый тип, объявленный dynamic, в основном говорят компилятору не пытаться проверять какие-либо операции над ним; Вы можете попытаться использовать любой оператор, вызвать любой метод и т. д. ОДНАКО, если оператор, член или любая другая выполняемая вами операция недопустима для объекта, который на самом деле находится за кадром, вы получите исключения времени выполнения, которые Вы должны обращаться очень крепко. По этой причине, dynamic функция .NET 4.0 не должна использоваться слегка.

Единственное, что вы можете сделать, как сказал Кратц, - это вернуть ArrayList или массив Object [] и использовать отражение, чтобы обнаружить структуру анонимного типа. Это нет-нет, во всяком случае, вы можете нарезать его; вы теряете строгую типизацию коллекции, ваш код значительно раздувается, так как вам требуется несколько строк кода для выполнения даже самых простых операций get или set, и отражение, опять же по своей природе, может быть в 100 раз медленнее, чем эквивалентная операция над известный статический тип.

1 голос
/ 09 августа 2011

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

Вы можете использовать отражение, чтобы получить значения и просто объявить переменную как тип IList, но это будет гораздо больше работы, чем просто создание нового типа.

0 голосов
/ 09 августа 2011

Вы можете сделать List<Object>, а в своем коде вы можете проверить такой тип:

if(myList[index].GetType() == typeof(Class1))
{
   //put your code for class1
}
else if(myList[index].GetType() == typeof(Class2))
{
   //put your code for class2
}
...