/// ------------------------------------------------------------------------------------ /// <summary> /// Creates an inspector object for an exception. /// </summary> /// <param name="e">The exception</param> /// <param name="obj">The object.</param> /// <param name="level">The indentation level.</param> /// ------------------------------------------------------------------------------------ protected IInspectorObject CreateExceptionInspectorObject(Exception e, object obj, string propName, int level, IInspectorObject ioParent) { string msg = e.Message; StringBuilder trace = new StringBuilder("Exception:" + e.StackTrace); e = e.InnerException; while (e != null) { msg = e.Message; trace.Append(Environment.NewLine); trace.Append(e.StackTrace); e = e.InnerException; } GenericInspectorObject gio = new GenericInspectorObject(); gio.DisplayName = propName; gio.DisplayValue = "Error: " + msg; gio.DisplayType = trace.ToString(); gio.Flid = 0; gio.Object = gio.OriginalObject = obj; gio.OwningList = this; gio.Level = level; gio.OwningObject = null; gio.ParentInspectorObject = ioParent; return(gio); }
/// ------------------------------------------------------------------------------------ /// <summary> /// Gets an inspector object for the specified property info., object and level. /// </summary> /// ------------------------------------------------------------------------------------ protected virtual IInspectorObject CreateInspectorObject(PropertyInfo pi, object obj, object owningObj, IInspectorObject ioParent, int level) { bool fSetHasChildrenFromType = true; Type objType = null; GenericInspectorObject gio = new GenericInspectorObject(); gio.Object = gio.OriginalObject = obj; gio.OwningList = this; gio.Flid = 0; gio.ParentInspectorObject = ioParent; gio.Level = level; gio.OwningObject = owningObj; gio.DisplayValue = (obj == null ? "null" : obj.ToString()); if (obj != null) { objType = obj.GetType(); gio.DisplayType = CleanupGenericListType(objType.ToString()); // Check if the object is a collection. If so, we need to convert it // to an array and store that array as the object. It makes for easier // handling when the object is expanded. REVIEW: Are there more enumerable // types that we should not treat as an array? bool showAsArray = (obj.GetType() != typeof(string) && objType.GetInterface("IEnumerable") != null); if (showAsArray || obj.ToString() != null && obj.ToString().StartsWith("System.Linq.Enumerable+<CastIterator>")) { var collection = new List <object>(((IEnumerable)obj).Cast <object>()); object[] array = collection.ToArray(); gio.Object = array; gio.DisplayValue = FormatCountString(array.Length); gio.HasChildren = (array.Length > 0); fSetHasChildrenFromType = false; } } if (pi != null) { gio.DisplayName = pi.Name; if (objType == null) { objType = pi.PropertyType; gio.DisplayType = CleanupGenericListType(objType.ToString()); } } if (objType != null) { gio.DisplayType = CleanupGenericListType(gio.DisplayType.Replace('+', '.')); if (fSetHasChildrenFromType) { BindingFlags flags = BindingFlags.Instance | BindingFlags.Public; gio.HasChildren = (obj != null && objType.GetProperties(flags).Length > 0 && !objType.IsPrimitive && objType != typeof(string) && objType != typeof(Guid)); } } return(gio); }