Esempio n. 1
0
 static ObservableCollection <TElement> MakeObservableCollection <TElement>(object[] items, IObjectReflector reflector)
 {
     return(new ObservableCollection <TElement>(MakeList <TElement>(items, reflector)));
 }
Esempio n. 2
0
 static ILookup <string, TValue> MakeLookupCore <TValue>(IEnumerable <KVObject> items, IObjectReflector reflector)
 => items.ToLookup(kv => kv.Name, kv => ConvertValue <TValue>(kv.Value, reflector));
Esempio n. 3
0
 static List <TElement> MakeList <TElement>(object[] items, IObjectReflector reflector)
 {
     return(items.Select(i => ConvertValue <TElement>(i, reflector))
            .ToList());
 }
Esempio n. 4
0
 static object MakeLookup(Type valueType, IEnumerable <KVObject> items, IObjectReflector reflector)
 => InvokeGeneric(nameof(MakeLookupCore), valueType, new object[] { items, reflector });
Esempio n. 5
0
 public static object MakeObject(Type objectType, KVObject keyValueObject, IObjectReflector reflector)
 => InvokeGeneric(nameof(MakeObject), objectType, new object[] { keyValueObject, reflector });
Esempio n. 6
0
 static KVObject CopyObject(object @object, string name, IObjectReflector reflector, HashSet <object> visitedObjects)
 => FromObjectCore(@object.GetType(), @object, name, reflector, visitedObjects);
Esempio n. 7
0
        static KVObject FromObjectCore <TObject>(TObject managedObject, string topLevelName, IObjectReflector reflector, HashSet <object> visitedObjects)
        {
            if (managedObject == null)
            {
                throw new ArgumentNullException(nameof(managedObject));
            }

            Require.NotNull(topLevelName, nameof(topLevelName));
            Require.NotNull(reflector, nameof(reflector));
            Require.NotNull(visitedObjects, nameof(visitedObjects));

            if (!typeof(TObject).IsValueType && typeof(TObject) != typeof(string) && !visitedObjects.Add(managedObject))
            {
                throw new KeyValueException("Serialization failed - circular object reference detected.");
            }

            if (typeof(IConvertible).IsAssignableFrom(typeof(TObject)))
            {
                return(new KVObject(topLevelName, (string)Convert.ChangeType(managedObject, typeof(string))));
            }

            var childObjects = new List <KVObject>();

            if (typeof(IDictionary).IsAssignableFrom(typeof(TObject)))
            {
                var dictionary = (IDictionary)managedObject;
                var enumerator = dictionary.GetEnumerator();
                while (enumerator.MoveNext())
                {
                    var entry = enumerator.Entry;
                    childObjects.Add(new KVObject(entry.Key.ToString(), entry.Value.ToString()));
                }
            }
            else if (typeof(TObject).IsArray || typeof(IEnumerable).IsAssignableFrom(typeof(TObject)))
            {
                var counter = 0;
                foreach (var child in (IEnumerable)managedObject)
                {
                    var childKVObject = CopyObject(child, counter.ToString(), reflector, visitedObjects);
                    childObjects.Add(childKVObject);

                    counter++;
                }
            }
            else
            {
                foreach (var member in reflector.GetMembers(managedObject).OrderBy(p => p.Name))
                {
                    if (!member.MemberType.IsValueType && member.Value is null)
                    {
                        continue;
                    }

                    var name = member.Name;
                    if (!member.IsExplicitName && name.Length > 0 && char.IsUpper(name[0]))
                    {
                        name = char.ToLower(name[0]) + name.Substring(1);
                    }

                    if (typeof(IConvertible).IsAssignableFrom(member.MemberType))
                    {
                        childObjects.Add(new KVObject(name, (string)Convert.ChangeType(member.Value, typeof(string))));
                    }
                    else
                    {
                        childObjects.Add(CopyObject(member.Value, member.Name, reflector, visitedObjects));
                    }
                }
            }

            return(new KVObject(topLevelName, childObjects));
        }
        static KVObject FromObjectCore(Type objectType, object managedObject, string topLevelName, IObjectReflector reflector, HashSet <object> visitedObjects)
        {
            if (managedObject == null)
            {
                throw new ArgumentNullException(nameof(managedObject));
            }

            Require.NotNull(topLevelName, nameof(topLevelName));
            Require.NotNull(reflector, nameof(reflector));
            Require.NotNull(visitedObjects, nameof(visitedObjects));

            var transformedValue = ConvertObjectToValue(objectType, managedObject, reflector, visitedObjects);

            return(new KVObject(topLevelName, transformedValue));
        }