Esempio n. 1
0
        /// ------------------------------------------------------------------------------------
        /// <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);
        }
Esempio n. 2
0
        /// ------------------------------------------------------------------------------------
        /// <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);
        }