Как привести из объекта [], хранящегося как объект в C # - PullRequest
0 голосов
/ 25 августа 2018

У меня List<object> хранится в базе данных.Каждый объект списка состоит из object[], состоящего из значений int.

Я могу сохранять, просматривать и извлекать данные.Я могу просмотреть данные в отладчике.Но я не могу привести обратно к int или массиву.

foreach (object item in list)
{
    if (item.GetType().IsArray)
    {
        var arr = item as int[];

        foreach (var i in arr)
            print(i);
    }
}

В операторе if item показывает данные в отладчике, изображенном ниже, но имеет значение false, но как я могу привести обратно к object []?

enter image description here

Я также пытался:

var newItem = item as object[];

Редактировать: это то, как я инициализирую объект.Я начинаю с объекта, потому что получаю ошибки приведения, если пытаюсь обернуть int [] при отправке в базу данных.

var listValues = new List<object>();
var newArray   = new object[10];

newArray[0] = (int)c.Tag;
newArray[1] = (int)c.FPos;
newArray[2] = (int)c.ToL;

listValues.Add(newArray);

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

После выбора ваших предметов из БД вы не получите реальное array. Вместо этого вы получаете List, который нельзя просто привести к типу массива. Таким образом, item.GetType().IsArray также ложно, потому что это List

Попробуйте следующее:

foreach (object item in list)
{
       IEnumerable<object> itemAsObjectEnumerable = (IEnumerable<object>)item;
       IEnumerable<int> itemAsIntEnumerable = itemAsObjectEnumerable.Cast<int>();
       foreach (var i in itemAsIntEnumerable)
       {
            print(i);
       }
}
0 голосов
/ 25 августа 2018

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...