PropertyInfo GetValue выдает ошибку во время рекурсии
Я получаю "Объект не соответствует типу цели", когда я пытаюсь получить значение объекта во время выполнения в моей программе на C#.
public void GetMyProperties(object obj)
{
foreach(PropertyInfo pinfo in obj.GetType().GetProperties())
{
if(!Helper.IsCustomType(pinfo.PropertyType))
{
string s = pinfo.GetValue(obj, null); //throws error during recursion call
propArray.Add(s);
}
else
{
object o = pinfo.PropertyType;
GetMyProperties(o);
}
}
}
Я передаю объект моего класса BrokerInfo, который имеет одно свойство типа Broker, у которого у inturn есть свойства - FirstName и LastName (все строки для простоты).
- BrokerInfo
- Broker
- FirstName
- LastName
Я пытаюсь рекурсивно проверять пользовательские типы и пытаться получить их значения. Я могу сделать что-то вроде:
- Broker
- FirstName
- LastName
Пожалуйста помоги.
Обновление: удалось решить с помощью leppie: вот модифицированный код.
public void GetMyProperties(object obj)
{
foreach(PropertyInfo pinfo in obj.GetType().GetProperties())
{
if(!Helper.IsCustomType(pinfo.PropertyType))
{
string s = pinfo.GetValue(obj, null);
propArray.Add(s);
}
else
{
object o = pinfo.GetValue(obj, null);
GetMyProperties(o);
}
}
}
IsCustom - мой метод, чтобы проверить, является ли тип обычным типом или нет. Вот код:
public static bool IsCustomType(Type type)
{
//Check for premitive, enum and string
if (!type.IsPrimitive && !type.IsEnum && type != typeof(string))
{
return true;
}
return false;
}
1 ответ
Решение
Почему вы углубляетесь в тип, а не в экземпляр?
Конкретно здесь:
object o = pinfo.PropertyType;
GetMyProperties(o);
Это должно выглядеть примерно так:
var o = pinfo.GetValue(obj, null);
GetMyProperties(o);