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); }
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 ); } }