static ObservableCollection <TElement> MakeObservableCollection <TElement>(object[] items, IObjectReflector reflector) { return(new ObservableCollection <TElement>(MakeList <TElement>(items, reflector))); }
static ILookup <string, TValue> MakeLookupCore <TValue>(IEnumerable <KVObject> items, IObjectReflector reflector) => items.ToLookup(kv => kv.Name, kv => ConvertValue <TValue>(kv.Value, reflector));
static List <TElement> MakeList <TElement>(object[] items, IObjectReflector reflector) { return(items.Select(i => ConvertValue <TElement>(i, reflector)) .ToList()); }
static object MakeLookup(Type valueType, IEnumerable <KVObject> items, IObjectReflector reflector) => InvokeGeneric(nameof(MakeLookupCore), valueType, new object[] { items, reflector });
public static object MakeObject(Type objectType, KVObject keyValueObject, IObjectReflector reflector) => InvokeGeneric(nameof(MakeObject), objectType, new object[] { keyValueObject, reflector });
static KVObject CopyObject(object @object, string name, IObjectReflector reflector, HashSet <object> visitedObjects) => FromObjectCore(@object.GetType(), @object, name, reflector, visitedObjects);
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)); }