2013-12-09 3 views
3

У меня есть запрос ссылки, который возвращает разные списки данных для заполнения разных Grids на веб-страницах, , но он всегда возвращает некоторые стандартные свойства, а также коллекцию анонимных объектов.Ввод анонимной коллекции в класс

поэтому я хочу класс, который имеет 3 свойства int для 'Total', 'Page' и 'Count' , а затем свойство, которое представляет собой коллекцию. Я все еще хочу изменить свойство, чтобы использовать этот объект для возврата нескольких типов запросов. Я знаю, что я мог бы «жестко печатать» каждый запрос, но есть так много вариантов запросов, что было бы лучше иметь общий тип класса, который принял бы коллекцию Anonymous.

Я попытался с помощью свойства

List<object> myQueryCollection 

но получаю ошибку:

Error 205 Cannot implicitly convert type System.Collections.Generic.List<AnonymousType#1> to System.Collections.Generic.List<object>

Как я могу получить класс, который имеет 3 ИНТ свойства и свойство Collection, который принимает анонимный тип ,

Я хочу передать правильный объект из моего БИЗ слоя к моим взглядам ...

var jsonData = new { 
     total = totalPages, 
     page = gridSettings.PageIndex, 
     records = counter, 
     rows = (from c in ucs select new {id = c.id, createDate =   
     c.CreateDate}).ToList() 
}; 
+0

Вместо этого вы должны отредактировать свой вопрос, а комментарии не предназначены для написания дополнительного кода. – svick

ответ

3

it would be best to have a generic type of class which would accept an Anonymous collection

Тогда вы должны сделать свой тип родовым, подобно тому, что lazyberezovsky предложил в своем ответе. Вам нужно использовать вывод типа, который не работает над конструкторами. Но вы можете использовать метод с static фабрики:

public static class ResultFactory 
{ 
    public static Result<T> Create<T>(int total, int page, List<T> items) 
    { 
     return new Result<T> { Total = total, Page = page, Items = items }; 
    } 
} 

Использование:

var data = ResultFactory.Create(
     totalPages, 
     gridSettings.PageIndex, 
     (from c in ucs select new { c.id, createDate = c.CreateDate }).ToList()); 

Если вы не хотите, чтобы сделать это, вы могли бы использовать ковариантный интерфейс как IEnumerable (или IReadOnlyList если вы на .Net 4.5) вместо List. Вы не можете наложить List<AnonymousType> на List<object> (или IList<object>), потому что это небезопасно. Но его можно отбросить до IEnumerable<object>.

Еще один вариант - создать List<object>, содержащий объекты анонимного типа в первую очередь. Для этого укажите тип при вызове ToList: .ToList<object>() вместо .ToList().

+0

Создать «Невозможно объявить члены экземпляра в статическом классе» – matthewbaskey

+0

@magister Извините, метод должен был быть «статическим», исправленным сейчас. – svick

4

Вы можете создать

public class Result<T> 
{ 
    public int Total { get; set; } 
    public int Page { get; set; } 
    public int Count { get { return Items.Count; } } 
    public List<T> Items { get; set; } 
} 

И расширение метод обобщенного класса для создания экземпляра этого класса параметризованных с анонимного типа:

public static Result<T> ToResult<T>(this List<T> source) 
{ 
    return new Result<T> { Items = source }; 
} 

Использование:

var result = yourList.ToResult(); 
+0

является статическим методом в другом файле ... Я получаю сообщение об ошибке «Ожидание класса, делегирования, перечисления, интерфейса или структуры – matthewbaskey

+0

@magister У вас не может быть метода непосредственно в файле, вы должны поместить его в класс '. И в случае метода расширения этот' class' должен быть 'static'. – svick

+0

, но является частью статического метода класса результатов или является отдельным? – matthewbaskey

0

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

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

var jsonData = new { 
     total = totalPages, 
     page = gridSettings.PageIndex, 
     records = counter, 
     rows = (from c in ucs select new {id = c.id, createDate =   
     c.CreateDate}).Cast<Object>().ToList() 
}; 

jsonData.rows теперь будет список объектов, вместо анонимного типа.

+0

В моем ответе , Я предложил более короткий способ сделать то же самое: '.ToList ()'. – svick

Смежные вопросы