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

Как я могу прочитать свойства объекта, который содержит элемент массива, используя отражение в С#. Если у меня есть метод 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. Я хочу прочитать все свойства сверху вниз и сохранить пару имени/значения в элементе словаря/списка. Я могу сделать это для значения, custom, enum type. Я застрял с массивом объектов. Не знаете, как это сделать.

Ответ 1

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

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());
        }
      }
    }
  }
}

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

Ответ 2

Вам нужно будет вернуть объект значения свойства, а затем вызвать 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();
    }
}

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