Ошибка при использовании LINQ с анонимными классами и неявно типизированными массивами в ASP.NET WebPages - PullRequest
0 голосов
/ 06 июня 2011

Я пытаюсь смоделировать страницу, используя WebMatrix, используя скрытые веб-страницы.Я назначил неявно типизированный массив анонимных объектов одному из ключей PageData, но я получаю следующую ошибку при попытке использовать методы LINQ для коллекции:

CS1977: Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

ЗдесьВот пример кода:

@{
  PageData["Vals"] = new [] {
    new { ID=1, Quantity=5 },
    new { ID=2, Quantity=3 }
  };
  var sum = PageData["Vals"].Sum(x => x.Quantity);
}

Если я сначала сохраню массив в обычном объекте, я могу использовать методы LINQ на нем просто отлично.Кажется, есть проблема, когда он выходит из PageData как динамический объект - но я не могу понять секретный соус, чтобы вернуть его к исходному типу.

1 Ответ

2 голосов
/ 06 июня 2011

Общее решение этой проблемы - явное приведение. Т.е. приведите выражение PageData["Vals"] к массиву ожидаемого вами типа. Однако это не может работать с анонимными типами, потому что у вас нет дескриптора его типа и, следовательно, вы не можете его привести.

Как только вы сохранили new[] { ... } в динамически набранном PageData, вы потеряли все ссылки во время компиляции на анонимный тип. Поэтому попытка использовать для него операторы LINQ, зависящие от типа, не является началом.

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

...