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

Как я могу прочитать свойства объекта, который содержит элемент типа массива, используя отражение в C#. Если у меня есть метод GetMyProperties, и я определяю, что объект является пользовательским типом, то как я могу прочитать свойства массива и значения внутри него. IsCustomType - метод, чтобы определить, является ли тип пользовательским типом или нет.

public void GetMyProperties(object obj) 
{ 
    foreach (PropertyInfo pinfo in obj.GetType().GetProperties()) 
    { 
        if (!Helper.IsCustomType(pinfo.PropertyType)) 
        { 
            string s = pinfo.GetValue(obj, null).ToString(); 
            propArray.Add(s); 
        } 
        else 
        { 
            object o = pinfo.GetValue(obj, null); 
            GetMyProperties(o); 
        } 
    } 
}

Сценарий таков: у меня есть объект ArrayClass, а ArrayClass имеет два свойства:

-string Id
-DeptArray[] depts

DeptArray - еще один класс с 2 свойствами:

-string code 
-string value

Итак, этот метод получает объект ArrayClass. Я хочу прочитать все свойства сверху вниз и сохранить пару имя / значение в словаре / элементе списка. Я могу сделать это для значения, обычай, тип enum. Я застрял с массивом объектов. Не уверен, как это сделать.

2 ответа

Решение

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

public static void GetMyProperties(object obj)
{
  foreach (PropertyInfo pinfo in obj.GetType().GetProperties())
  {
    var getMethod = pinfo.GetGetMethod();
    if (getMethod.ReturnType.IsArray)
    {
      var arrayObject = getMethod.Invoke(obj, null);
      foreach (object element in (Array) arrayObject)
      {
        foreach (PropertyInfo arrayObjPinfo in element.GetType().GetProperties())
        {
          Console.WriteLine(arrayObjPinfo.Name + ":" + arrayObjPinfo.GetGetMethod().Invoke(element, null).ToString());
        }
      }
    }
  }
}

Я протестировал этот код, и он правильно разрешает массивы путем отражения.

Вам нужно извлечь объект значения свойства и затем вызвать для него метод GetType(). Тогда вы можете сделать что-то вроде этого:

var type = pinfo.GetGetMethod().Invoke(obj, new object[0]).GetType();
if (type.IsArray)
{
    Array a = (Array)obj;
    foreach (object arrayVal in a)
    {
        // reflect on arrayVal now
        var elementType = arrayVal.GetType();
    }
}

К вашему сведению - я извлек этот код из метода рекурсивного форматирования объектов (я бы сейчас использовал для этого сериализацию JSON).

Другие вопросы по тегам