Пример #1
0
        public ObjectPropertyList LookupObjectProperties(object value)
        {
            if (TryLookupExpandoObject(value, out var propertyValues))
            {
                return(propertyValues);
            }

            if (!ReferenceEquals(ObjectTypeTransformation, Instance))
            {
                var result = ObjectTypeTransformation.TryTransformObject(value);
                if (result != null)
                {
                    if (result is IConvertible)
                    {
                        return(new ObjectPropertyList(result, ObjectPropertyInfos.SimpleToString.Properties, ObjectPropertyInfos.SimpleToString.FastLookup));
                    }

                    if (TryLookupExpandoObject(result, out propertyValues))
                    {
                        return(propertyValues);
                    }

                    value = result;
                }
            }

            var objectType    = value.GetType();
            var propertyInfos = BuildObjectPropertyInfos(value, objectType);

            ObjectTypeCache.TryAddValue(objectType, propertyInfos);
            return(new ObjectPropertyList(value, propertyInfos.Properties, propertyInfos.FastLookup));
        }
Пример #2
0
        public bool TryLookupExpandoObject(object value, out ObjectPropertyList objectPropertyList)
        {
            if (value is IDictionary <string, object> expando)
            {
                objectPropertyList = new ObjectPropertyList(expando);
                return(true);
            }

#if DYNAMIC_OBJECT
            if (value is DynamicObject d)
            {
                var dictionary = DynamicObjectToDict(d);
                objectPropertyList = new ObjectPropertyList(dictionary);
                return(true);
            }
#endif

            Type objectType = value.GetType();
            if (ObjectTypeCache.TryGetValue(objectType, out var propertyInfos))
            {
                if (!propertyInfos.HasFastLookup)
                {
                    var fastLookup = BuildFastLookup(propertyInfos.Properties, false);
                    propertyInfos = new ObjectPropertyInfos(propertyInfos.Properties, fastLookup);
                    ObjectTypeCache.TryAddValue(objectType, propertyInfos);
                }
                objectPropertyList = new ObjectPropertyList(value, propertyInfos.Properties, propertyInfos.FastLookup);
                return(true);
            }

            if (TryExtractExpandoObject(objectType, out propertyInfos))
            {
                ObjectTypeCache.TryAddValue(objectType, propertyInfos);
                objectPropertyList = new ObjectPropertyList(value, propertyInfos.Properties, propertyInfos.FastLookup);
                return(true);
            }

            objectPropertyList = default(ObjectPropertyList);
            return(false);
        }