コード例 #1
0
        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);
        }
コード例 #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
                    );
            }
        }
コード例 #3
0
ファイル: WebGrid.cs プロジェクト: Nishadks1/aspnetwebstack-1
        private static IEnumerable <string> GetDefaultColumnNames(IEnumerable <dynamic> source, Type elementType)
        {
            var dynObj = source.FirstOrDefault() as IDynamicMetaObjectProvider;

            if (dynObj != null)
            {
                return(DynamicHelper.GetMemberNames(dynObj));
            }
            else
            {
                return((from p in elementType.GetProperties()
                        where IsBindableType(p.PropertyType) && (p.GetIndexParameters().Length == 0)
                        select p.Name).OrderBy(n => n, StringComparer.OrdinalIgnoreCase).ToArray());
            }
        }