internal static object NodeToType(Type type, YamlNode node) { // special snowflake string if (type == typeof(String)) { return(node.ToString()); } // val primitives if (type.IsPrimitive) { return(StringToType(type, node.ToString())); } // val enum if (type.IsEnum) { return(Enum.Parse(type, node.ToString())); } // custom TypeSerializer if (_typeSerializers.TryGetValue(type, out var serializer)) { return(serializer.NodeToType(type, node)); } // other val (struct) if (type.IsValueType) { return(_structSerializer.NodeToType(type, (YamlMappingNode)node)); } throw new ArgumentException($"Type {type.FullName} is not supported.", nameof(type)); }
internal static object NodeToType(Type type, YamlNode node) { // special snowflake string if (type == typeof(String)) { return(node.ToString()); } // val primitives if (type.IsPrimitive) { return(StringToType(type, node.ToString())); } // val enum if (type.IsEnum) { return(Enum.Parse(type, node.ToString())); } // List<T> if (TryGenericListType(type, out var listType)) { var listNode = (YamlSequenceNode)node; var newList = (IList)Activator.CreateInstance(type); foreach (var entryNode in listNode) { var value = NodeToType(listType, entryNode); newList.Add(value); } return(newList); } // Dictionary<K,V> if (TryGenericDictType(type, out var keyType, out var valType)) { var dictNode = (YamlMappingNode)node; var newDict = (IDictionary)Activator.CreateInstance(type); foreach (var kvEntry in dictNode.Children) { var keyValue = NodeToType(keyType, kvEntry.Key); var valValue = NodeToType(valType, kvEntry.Value); newDict.Add(keyValue, valValue); } return(newDict); } // custom TypeSerializer if (_typeSerializers.TryGetValue(type, out var serializer)) { return(serializer.NodeToType(type, node)); } // other val (struct) if (type.IsValueType) { return(_structSerializer.NodeToType(type, (YamlMappingNode)node)); } // ref type that isn't a custom TypeSerializer throw new ArgumentException($"Type {type.FullName} is not supported.", nameof(type)); }