示例#1
0
        /// <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;
        }
示例#2
0
        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);
        }
示例#3
0
        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);
            }
        }
示例#4
0
 public static object MakeObjectCollection(Type type, KvCollectionValue keyValueCollection)
 => MakeObjectCollection(type, keyValueCollection, new DefaultObjectReflector());