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