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