ArXen42
@ArXen42

Как получить элементы массива или списка через рефлекцию (отражение, reflection)?

Вроде простой вопрос, но поверхностный гугл и msdn не дали ответа на вопрос, видимо плохо искал. Я обрабатываю некий объект. И если он оказался массивом, мне нужно рекурсивно обращаться ко всем его элементам. Главная проблема - это не обязательно может быть массив, т.е. я не могу с ним индексный оператор [] использовать.
Т.е. упрощенно код выглядит так:
...
if (obj.GetType().IsArray)
	{
		//Получить элементы массива obj
	}
  • Вопрос задан
  • 535 просмотров
Решения вопроса 3
Deerenaros
@Deerenaros
Программист, математик, задрот и даже чуть инженер
Не понял, что значит "поверхностный гугл".

if (obj.GetType().IsArray)
  {
    obj.GetType().GetMethod("GetValue", typeof(int)).Invoke(obj, index);
  }


Однако, возможно проще будет использовать DLR.
Ответ написан
IEnumerable - интерфейс.
IEnumerable array = obj as IEnumerable;
Проверьте "array" на null перед использованием.
Ответ написан
ArXen42
@ArXen42 Автор вопроса
Не знаю, как оно работает, но получилось вот так:
Type objType = obj.GetType();
if (objType.IsArray)
		{
			IEnumerable array = obj as IEnumerable;
			foreach (var element in array)
				//Действия над элементами
		}


За Invoke спасибо, теперь хоть знаю, что это такое и зачем. Я сначала пытался сделать так:
for (int i = 0; i < (int)(objType.GetProperty("Length").GetGetMethod().Invoke(obj))); i++)
				var element = objType.GetMethod("GetValue", typeof(int)).Invoke(obj, i);

Но оно вызывает ошибки, как минимум первый Invoke для получения длины массива. Для общего развития, что здесь не так?

P.P.S. прикладываю ошибки:
d4c9c4838d0d4fefac017e3b18ee02c7.png
//------------------------------------------------------------
99b277b48dc64d9e81cf829e6eaee59a.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы