Как уже отмечали другие, вам нужно вызвать элемент GetValue
, чтобы получить значение свойства - итерация, которую вы реализовали, выполняет итерации по PropertyInfo
объектам, которые являются "дескрипторами свойства", а не фактическими значениями , Однако я не совсем понимаю, почему вы используете циклы GetEnumerator
и while
явно, когда то же самое можно записать с помощью цикла for
.
Кроме того, вам не нужно игнорировать значение, возвращаемое вызовом sb.Append
- вы можете просто вернуть его как общий результат (потому что это StringBuilder
). Это на самом деле сделает код более эффективным (поскольку он позволяет оптимизировать хвостовой вызов). И наконец, вам не нужно ToString
в sb.Append(..)
, потому что метод Append
перегружен и работает для всех стандартных типов.
Таким образом, после некоторого упрощения вы можете получить что-то вроде этого (на самом деле он не использует параметр depth
, но, я думаю, вы захотите использовать его для чего-нибудь позже):
let rec printObj (o : obj) (sb : StringBuilder) (depth : int) =
let props = o.GetType().GetProperties()
for propInfo in props do
let propValue = propInfo.GetValue(o, null)
match propValue with
| :? string as s -> sb.Append(s)
| :? bool as c -> sb.Append(c)
| :? int as i -> sb.Append(i)
| :? float as i -> sb.Append(i)
| _ -> printObj currObj sb (depth + 1)