public KVConditionEvaluator(ICollection <string> definedVariables)
        {
            Require.NotNull(definedVariables, nameof(definedVariables));

            this.definedVariables = definedVariables;
        }
示例#2
0
 public KVObject Get(string name)
 {
     Require.NotNull(name, nameof(name));
     return(children.FirstOrDefault(c => c.Name == name));
 }
示例#3
0
        private static KvObject FromObjectCore <TObject>(TObject managedObject, string topLevelName, IObjectReflector reflector, HashSet <object> visitedObjects, IObjectMember objectMember = null)
        {
            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 collectionType = objectMember?.CollectionType ?? KvCollectionType.Default;

                switch (collectionType)
                {
                case KvCollectionType.ValueList:
                    var counter = 0;
                    foreach (var child in (IEnumerable)managedObject)
                    {
                        var childKvObject = CopyObject(child, counter.ToString(), reflector, visitedObjects);
                        childObjects.Add(childKvObject);

                        counter++;
                    }
                    break;

                case KvCollectionType.CharSeparated:
                    if (objectMember == null)
                    {
                        throw new InvalidOperationException();
                    }

                    var sb = new StringBuilder();
                    foreach (var child in (IEnumerable)managedObject)
                    {
                        var str = Convert.ChangeType(child, typeof(string));
                        sb.Append(str);
                        sb.Append(objectMember.CollectionTypeSeparator);
                    }

                    return(new KvObject(topLevelName, sb.ToString().TrimEnd(objectMember.CollectionTypeSeparator)));

                default:
                    throw new NotSupportedException("Unsupported KvCollectionType for serialisation.");
                }
            }
            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);
                    }

                    childObjects.Add(typeof(IConvertible).IsAssignableFrom(member.MemberType)
                        ? new KvObject(name, (string)Convert.ChangeType(member.Value, typeof(string)))
                        : CopyObject(member.Value, member.Name, reflector, visitedObjects));
                }
            }

            return(new KvObject(topLevelName, childObjects));
        }
示例#4
0
 public void AddRange(IEnumerable <KVObject> values)
 {
     Require.NotNull(values, nameof(values));
     children.AddRange(values);
 }
示例#5
0
 public void Add(KVObject value)
 {
     Require.NotNull(value, nameof(value));
     children.Add(value);
 }
示例#6
0
 /// <summary>
 /// Adds a <see cref="KVObject" /> as a child of the current object.
 /// </summary>
 /// <param name="value">The child to add.</param>
 public void Add(KVObject value)
 {
     Require.NotNull(value, nameof(value));
     GetCollectionValue().Add(value);
 }
        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 (!visitedObjects.Add(managedObject))
            {
                throw new KeyValueException("Serialization failed - circular object reference detected.");
            }

            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))
                {
                    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));
        }
示例#8
0
 public KVStringValue(string value)
 {
     Require.NotNull(value, nameof(value));
     this.value = value;
 }