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