Подтвердить что ты не робот

Объект С# для массива

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

Во-первых, мне нужно проверить, что переданный объект - это какой-то массив (может быть 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 действительно существует и содержит элементы. Фактический экземпляр, который сохраняется, представляет собой строго типизированный List < > , но при необходимости может принимать ограниченное подмножество форм. Но точка упражнения заключается в том, что этот метод Example() не знает основного типа свойства.

4b9b3361

Ответ 1

Передача его в 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...
    }
}

Ответ 2

Попробуйте использовать IEnumerable. Это самый простой интерфейс для всех перечислений, массивов, списков и т.д.

IEnumerable myList = anArray as IEnumerable;
if (myList != null)
{
    foreach (object element in myList)
    {
        // ... do something
    }
}
else
{
    // it not an array, list, ...
}

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

 string[] arr = ((IEnumerable)yourOjbect).Cast<object>()
                             .Select(x => x.ToString())
                             .ToArray();