C # объект в массив - PullRequest
       41

C # объект в массив

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

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

Во-первых, мне нужно проверить, чтопереданный объект - это некий массив (может быть List, может быть object [] и т. д.).Затем мне нужно перебрать этот массив.Однако я не могу выполнить преобразование типов.

Вот как я его использую (сокращенно):

    private static void Example(object instance, PropertyInfo propInfo)
    {
        object anArray = propInfo.GetValue(instance, null);
        ArrayList myList = anArray as ArrayList;
        foreach (object element in myList)
        {
            // etc
        }
    }

Я пробовал разные варианты приведения.Вышеприведенное не вызывает исключения, но mylist имеет значение null, когда anArray действительно существует и содержит элементы.Фактически сохраняемый экземпляр является строго типизированным списком <>, но при необходимости может принимать ограниченное подмножество форм.Но смысл этого упражнения в том, что этот метод Example () не знает базовый тип свойства.

Ответы [ 5 ]

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

Преобразование в ArrayList будет работать только в том случае, если объект на самом деле является ArrayList.Он не будет работать с System.Array или System.Collections.Generic.List`1, например.

Я думаю, что вам действительно нужно сделать это привести его к IEnumerable, поскольку это ваше единственное требование к циклунад ним ...

object anArray = propInfo.GetValue(instance, null);
IEnumerable enumerable = anArray as IEnumerable;
if (enumerable != null)
{
    foreach(object element in enumerable)
    {
        // etc...
    }
}
14 голосов
/ 22 июня 2011

Попробуйте привести к IEnumerable. Это самый базовый интерфейс, который реализуют все перечислимые элементы, массивы, списки и т. Д.

IEnumerable myList = anArray as IEnumerable;
if (myList != null)
{
    foreach (object element in myList)
    {
        // ... do something
    }
}
else
{
    // it's not an array, list, ...
}
3 голосов
/ 06 июля 2017

Просто попробуйте

 string[] arr = ((IEnumerable)yourOjbect).Cast<object>()
                             .Select(x => x.ToString())
                             .ToArray();
1 голос
/ 22 июня 2011

Вы должны иметь возможность привести его к IEnumerable, если это коллекция любого рода (массив, список и т. Д.).Также PropertyInfo содержит свойство PropertyType, которое вы можете использовать, чтобы узнать фактический тип, если хотите.

1 голос
/ 22 июня 2011

Попробуйте это:

    var myList = anArray as IEnumerable;
    if (mylist != null)
    { 
        foreach (var element in myList)
        {
            // etc
        }
    }

Возможно, вам также потребуется указать общий тип IEnumerable, в зависимости от вашей ситуации.

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