public KVConditionEvaluator(ICollection <string> definedVariables) { Require.NotNull(definedVariables, nameof(definedVariables)); this.definedVariables = definedVariables; }
public KVObject Get(string name) { Require.NotNull(name, nameof(name)); return(children.FirstOrDefault(c => c.Name == name)); }
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)); }
public void AddRange(IEnumerable <KVObject> values) { Require.NotNull(values, nameof(values)); children.AddRange(values); }
public void Add(KVObject value) { Require.NotNull(value, nameof(value)); children.Add(value); }
/// <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)); }
public KVStringValue(string value) { Require.NotNull(value, nameof(value)); this.value = value; }