2011-02-02 3 views
11

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

+0

Привет, я не вижу из вашего кода то, чего вы пытаетесь достичь. Код не компилируется, поскольку pInfo.GetValue возвращает объект, а не строку. – Adam

+0

Извините. Я редактировал код для добавления ToString() в pInfo.GetValue(). Мне пришлось сделать этот метод. Первоначально метод имеет некоторую сложную логику. Чтобы упростить, мне нужно прочитать все свойства, свойство свойства и их значение. –

ответ

15

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

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

@evgk, я не могу эксплицитно наложить на DeptArray. Я определяю тип во время выполнения. Параметр метода «obj» может иметь любой объект класса. Мне нужен общий метод проверки массивов и повторения его элемента. –

+0

Или нет проблем, я изменил ответ. Теперь он получит все массивы в переданном объекте и будет проходить через каждый элемент массива и его свойства без эксплицитного литья. Вы также можете сделать этот метод рекурсивным, если хотите. – EvgK

+0

@Evgk, Блестящий! это прекрасно - спасибо, я проведу логику с разными свойствами объекта, чтобы увидеть, если это произойдет. Когда вы говорите рекурсивно, нужно ли проверить, имеет ли свойство массива массив? –

0

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

+0

Нет, я имею в виду GetGetMethod. Почему вы называете GetSetMethod? Разве вы не пытаетесь прочитать свойство, и если массив массивов DeptArray перебирает элементы и читает их? – JohnOpincar

+0

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

+0

John, Вы абсолютно правы, что мне нужно прочитать свойство и перебрать DeptArray. Когда я запускаю этот кусок кода. Я получаю ошибку кастинга в Array a = (Array) obj. Он говорит, что ARrayClass не может быть отправлен в Array. Думаешь, я пропустил что-то сказать? –