Перебирать коллекцию анонимного типа в .NET - PullRequest
2 голосов
/ 22 июня 2011

Я в порядке как с C #, так и с VB.NET

У меня есть функция GetListOfBook, которая возвращает результат LINQ to SQL, который содержит коллекцию объектов, таких как:

var result = GetListOfBook ();

  • Book - это объект Book, у которого свойство Title и ISBN,
  • Category является строкой
  • Author - это объект Author, у которого есть свойство Name и ID.

Внутри коллекции это выглядит так:

Внутри коллекции "result" это выглядит так:

{Book = {Book}, Category = "English", Author = {Author}}
{Book = {Book}, Category = "English", Author = {Author}}
{Book = {Book}, Category = "Web Development", Author = {Author}}

Я хочу перебрать каждый элемент в коллекции, чтобы получить название книги и ISBN, категорию и имя автора.Примерно так:

foreach (var r in result)
{
    Respone.Write(r.Book.Title, r.Book.ISBN, r.Category, r.Auhtor.Name);
}

В данный момент я пока не могу перебрать коллекцию.Спасибо за любые предложения.

Обновление:

Извините за беспокойство.Это на самом деле работает.Я нашел опечатку в коде.

Ответы [ 4 ]

7 голосов
/ 22 июня 2011

Вам все еще нужно использовать правильный синтаксис для foreach, который требует, чтобы вы указали тип для переменной цикла.Поскольку вы не можете назвать его явно, вам нужно использовать var, который выводит тип.

foreach (var r in result)
{
    Respone.Write(r.Book.Title, r.Book.ISBN, r.Category, r.Auhtor.Name);
}
3 голосов
/ 22 июня 2011

Вам необходимо использовать неявно типизированную переменную , использующую var для переменной итерации в foreach, так же, как вы, вероятно, должны начинать свой запрос с:

var result = ...; // Your existing query

// r is implicitly typed here
foreach (var r in result)
{
    Response.Write(r.Book.Title, r.Book.ISBN, r.Category, r.Author.Name);
}

РЕДАКТИРОВАТЬ: Если присмотреться к вашему коду, я подозреваю, что это проблема:

var result = GetListOfBook();

Это нельзя строго типизировать, если оно возвращает анонимный тип ... что означает, что оно должно возвращать что-то вроде IEnumerable или IEnumerable<object>. Я подозреваю, что вам нужно создать соответствующий «нормальный» тип, содержащий результаты из GetListOfBook - или выполнить запрос в том же методе, что и вызов Response.Write.

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

Вы можете использовать отражение следующим образом:

foreach (var r in result)
{
    PropertyInfo info = r.GetProperty("Category");
    Response.Write(info.GetValue(r, null));
}
1 голос
/ 22 июня 2011

Вы можете использовать отражение, чтобы получить доступ к свойствам анонимного типа.
Вы можете увидеть некоторые примеры здесь: http://blogs.msdn.com/b/wriju/archive/2007/10/26/c-3-0-anonymous-type-and-net-reflection-hand-in-hand.aspx

Но вы должны сделать это действительно в качестве крайней меры, если вы ДОЛЖНЫ использовать анонимные типы, а нечем явные типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...