/// <summary> /// Initializes a new instance of the <see cref="KvObject"/> class. /// </summary> /// <param name="name">Name of this object.</param> /// <param name="items">Child items of this object.</param> public KvObject(string name, IEnumerable <KvObject> items) { Require.NotNull(name, nameof(name)); Require.NotNull(items, nameof(items)); Name = name; var value = new KvCollectionValue(); value.AddRange(items); Value = value; }
public static object MakeObjectCollection(Type type, KvCollectionValue keyValueCollection, IObjectReflector reflector) { Require.NotNull(keyValueCollection, nameof(keyValueCollection)); Require.NotNull(reflector, nameof(reflector)); // Trying to cast to an IDictionary, so we add the values of the KvCollectionValue to the type if (typeof(IDictionary).IsAssignableFrom(type)) { var dict = (IDictionary)FormatterServices.GetUninitializedObject(type); foreach (var obj in keyValueCollection) { dict.Add(obj.Name, obj.Value.ToType(dict.GetType().GetGenericArguments()[1], CultureInfo.CurrentCulture)); } return(dict); } var typedObject = FormatterServices.GetUninitializedObject(type); CopyObjectCollection(keyValueCollection, typedObject, reflector); return(typedObject); }
public static void CopyObjectCollection(KvCollectionValue kv, object obj, IObjectReflector reflector) { Require.NotNull(kv, nameof(kv)); // Cannot use Require.NotNull here because TObject might be a struct. if (obj == null) { throw new ArgumentNullException(nameof(obj)); } Require.NotNull(reflector, nameof(reflector)); var members = reflector.GetMembers(obj).ToDictionary(m => m.Name, m => m, StringComparer.OrdinalIgnoreCase); foreach (var item in kv) { if (!members.TryGetValue(item.Name, out var member)) { continue; } member.Value = MakeObject(item, member.MemberType, reflector, member); } }
public static object MakeObjectCollection(Type type, KvCollectionValue keyValueCollection) => MakeObjectCollection(type, keyValueCollection, new DefaultObjectReflector());