A cast (обычно) отличается от конверсии .Большую часть времени, когда вы кастуете вещи в C #, вы предполагаете, что эти вещи уже такие, какими вы их называете, и вообще не меняете их.Существует исключение для типов значений, таких как int
, которые становятся "упакованными" и "распакованными", когда вы приводите их в object
.Однако это исключение не распространяется на приведение object[]
в int[]
.
int[]
- это не то же самое, что object[]
, поэтому вы не можете просто разыграть его как единое целое.Вместо этого вы должны создать новый массив (или Collection, или IEnumerable, или любой другой), который состоит из всех этих object
, распакованных в целые числа.Один из способов сделать это - использовать метод расширения Cast<>()
из пространства имен System.Linq.
int[] arr = ((object[])item).Cast<int>().ToArray();
Или, как более полный пример:
List<object[]> list = new List<object[]> { new object[] { 1, 2 }, new object[] { 3, 4 } };
foreach (object[] item in list)
{
if (item.GetType().IsArray)
{
var arr = item.Cast<int>();
foreach (var i in arr)
{
Console.WriteLine(i);
}
}
}
Обновление
Исходя из вашего обновленного вопроса, есть вероятность, что реальное решение вашей проблемы выйдет далеко за рамки исходного вопроса.Я не знаю, какой механизм вы используете для его хранения и извлечения из базы данных, но если вы используете что-то вроде Entity Framework, вам, вероятно, нужно изменить модель, чтобы ее значения были строго типизированы.Фактически, то, как вы снимаете свойства объекта и помещаете их в базу данных в виде массива, - это большой запах кода: скорее всего, ваша модель данных должна быть сведена в тип с именованными свойствами.
Но чтобы ответить на самую простую, самую основную часть вопроса: вы должны привести свои объекты к типу, который на самом деле равен , прежде чем пытаться преобразовать их.Если у вас есть List<object>
, используйте:
foreach (List<object> item in list)
{
int[] arr = item.Cast<int>().ToArray();
foreach (var i in arr)
{
Console.WriteLine(i);
}
}