private IEnumerable <Element> PropertiesEnumerator(TypeProperties typeProperties, object obj) { yield return(Element.CreateHeader("Properties", Color.green)); var propertyInfos = typeProperties.propertyInfos; for (int i = 0; i < propertyInfos.Length; i++) { var propertyInfo = propertyInfos[i]; object value; var propertyName = propertyInfo.Name; // Try invoking the property getter, if an exception occurs, do not call it again if (typeProperties.IsSkipped(propertyName)) { value = typeProperties.GetSkipReason(propertyName); } else { try { value = propertyInfo.GetValue(obj, null); } catch (Exception e) { e = e.InnerException ?? e; typeProperties.AddSkipped(propertyName, e); value = typeProperties.GetSkipReason(propertyName); } } yield return(Element.Create(value, propertyInfo.Name)); } }
private IEnumerable <Element> GetProperties(object obj, DisplayOption displayOptions) { var type = obj.GetType(); TypeProperties typeProperties; if (!typeToProperties.TryGetValue(type, out typeProperties)) { var propertyInfos = type.GetProperties(GetBindingFlags(displayOptions)); Array.Sort(propertyInfos, PropertyInfoComparer); typeProperties = new TypeProperties(propertyInfos); typeToProperties[type] = typeProperties; } return(PropertiesEnumerator(typeProperties, obj)); }