Использование отражения чтения свойств объекта, содержащего массив другого объекта - PullRequest
12 голосов
/ 02 февраля 2011

Как я могу прочитать свойства объекта, который содержит элемент типа массива, используя отражение в 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
* 1006другой класс с 2 свойствами:
-string code 
-string value

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

Ответы [ 2 ]

17 голосов
/ 03 февраля 2011

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

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

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

0 голосов
/ 02 февраля 2011

Вам нужно получить объект значения свойства и затем вызвать для него метод 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).

...