2016-01-11 4 views
0

Где-то в моем коде у меня есть объект, который я уже знаю, это список. Но я не знаю параметр типа этого списка. Мне нужно перебирать элементы. Я пытался бросить этот объект в список объектов, но это не помогло мне:Как перебирать элементы списка, когда у меня есть только доступ к объекту этого списка и не знаю параметр типа?

List<Object> objList = (List<Object>)(dataModel.Value); 
foreach (var item in objList) 
{ 
     Console.WriteLine(item.ToString()); 
} 

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

Возможно ли выполнить десериализацию и выполнить работу над десериализованными объектами?

+0

, что это тип dataModel.Value? –

+1

Работает ли это если вы делаете «IEnumerable '? – Enigmativity

+1

Как насчет http://stackoverflow.com/questions/632570/cast-received-object-to-a-listobject-or-ienumerableobject? Попробуйте использовать 'IList'. –

ответ

5

Вы должны наложить на IEnumerable<object> или даже на IEnumerable.

List<string> не List<object> как общая дисперсия не относится к классам, и List<string> не является IList<object>, как IList<T> не ковариантен. (Это не может быть, из-за операции, которые принимают в T, например Add.)

Однако IEnumerable<T> ковариантен в T это именно то, что вы хотите в этом случае - но только если значение является список ссылки типы; covariance не работает с аргументами типа, которые являются типами значений ... поэтому List<int> не конвертируется в IEnumerable<object>. Это является еще конвертируемым в IEnumerable, хотя, так что следующий код дает вам наиболее гибким решение:

var items = (IEnumerable) dataModel.Value; 
foreach (var item in items) 
{ 
    Console.WriteLine(item); 
} 
2

List<Something> не выводит из List<object> это происходит от object, но не от List<object>, это имеет смысл, поскольку это может быть очень небезопасным. Вы можете всегда относиться к List<int> как к object, но если бы вы могли рассматривать его как List<object>, тогда вы могли бы позвонить по номеру .Add("test") и в конечном итоге получить List<int>, содержащий string нарушение правил безопасности.

Однако недавние .net версии добавлены ковариации и контрвариацию, это не имеет смысла на List<T>, но это имеет смысл на IEnumerable<T> (так как вы не можете «добавить» к IEnumerable но только перечислить его, это очень прекрасно перечислять элементы произвольных типов как objects).

Таким образом, вы можете бросить к интерфейсу:

IEnumerable<Object> objList = (IEnumerable<Object>)(dataModel.Value); // This works, List<whatever> is IEnumerable<whatever>, IEnumerable<whatever> can safely be cast to IEnumerable<object> 

Или вы можете привести отдельные пункты сами, если вы хотите, чтобы придерживаться списка, создавая новый список, как, например:

List<object> objlist = dataModel.Value 
    .Cast<object>() // every item will be cast to object 
    .ToList(); // then make a new list out of it, this is type safe as the original List<whatever> is not affected. 

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

  • Нет связанных вопросов^_^