public override IDictionary <string, object> Serialize(
            object obj,
            JavaScriptSerializer serializer
            )
        {
            var values      = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase);
            var memberNames = DynamicHelper.GetMemberNames(obj);

            // This should never happen
            Debug.Assert(memberNames != null);

            // Get the value for each member in the dynamic object
            foreach (string memberName in memberNames)
            {
                object value     = DynamicHelper.GetMemberValue(obj, memberName);
                var    jsonValue = value as DynamicJsonArray;
                if (jsonValue != null)
                {
                    value = (object[])jsonValue;
                }
                values[memberName] = value;
            }

            return(values);
        }
Example #2
0
        public virtual void VisitComplexObject(object value, int depth)
        {
            if (depth > _recursionLimit)
            {
                return;
            }

            Debug.Assert(value != null, "Value should not be null");

            var dynamicObject = value as IDynamicMetaObjectProvider;

            // Only look at dynamic objects that do not implement ICustomTypeDescriptor
            if (dynamicObject != null && !(dynamicObject is ICustomTypeDescriptor))
            {
                var memberNames = DynamicHelper.GetMemberNames(dynamicObject);

                if (memberNames != null)
                {
                    // Always use the runtime type for dynamic objects since there is no metadata
                    VisitMembers(
                        memberNames,
                        name => null,
                        name => DynamicHelper.GetMemberValue(dynamicObject, name),
                        depth
                        );
                }
            }
            else
            {
                // REVIEW: We should try to filter out properties of certain types

                // Dump properties using type descriptor
                var props     = TypeDescriptor.GetProperties(value);
                var propNames = from PropertyDescriptor p in props select p.Name;

                VisitMembers(
                    propNames,
                    name => props.Find(name, ignoreCase: true).PropertyType,
                    name => GetPropertyDescriptorValue(value, name, props),
                    depth
                    );

                // Dump fields
                var fields = value
                             .GetType()
                             .GetFields(BindingFlags.Public | BindingFlags.Instance)
                             .ToDictionary(field => field.Name);

                VisitMembers(
                    fields.Keys,
                    name => fields[name].FieldType,
                    name => GetFieldValue(value, name, fields),
                    depth
                    );
            }
        }