Объект С# для массива
С помощью отражения у меня есть объект, который мне нужно включить в итерируемый список элементов (тип неизвестен, будет объектом). Используя окно "Смотреть", я вижу, что мой объект представляет собой массив некоторого типа, поскольку он сообщает мне количество элементов, и я могу взорвать древовидное представление, чтобы увидеть сами элементы.
Во-первых, мне нужно проверить, что переданный объект - это какой-то массив (может быть 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() не знает основного типа свойства.
Ответы
Ответ 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();