private OMCLItem DoParseArray(List <string> tags) { OMCLArray resultArray = new OMCLArray(); if (!Expect(TokenType.OpenBracket)) { ReportError("Failed to parse array. Expected '['"); } SkipNewlines(); var next = PeekToken(); while (true) { if (next.Type == TokenType.EOF) { ReportError("Unexpected end of file in array"); return(null); } if (next.Type == TokenType.ClosingBracket) { break; } var item = ParseItem(); resultArray.Add(item); bool nl = SkipNewlines(); next = PeekToken(); if (next.Type == TokenType.ClosingBracket) { break; } else if (next.Type == TokenType.Comma) { NextToken(); SkipNewlines(); next = PeekToken(); } else if (!nl) { ReportError("Failed to parse array. Expected '\\n' or ',' after value in array"); return(null); } } if (!Expect(TokenType.ClosingBracket)) { ReportError("Failed to parse array. Expected ']'"); return(null); } OMCLItem result = resultArray; result.Tags = tags; return(result); }
private object ConvertArray(Type type, List <string> tags, OMCLArray array) { // handle custom converters if (_arrayConverters.ContainsKey(type)) { var conv = _arrayConverters[type]; var collection = conv.CreateInstance(); foreach (var item in array) { var value = ConvertItemToValue(conv.ElementType, item); conv.AddValue(collection, value); } return(collection); } // arrays if (type.IsArray) { var elemType = type.GetElementType(); var arr = Array.CreateInstance(elemType, array.Length); for (int i = 0; i < arr.Length; i++) { var item = array[i]; var value = ConvertItemToValue(elemType, item); arr.SetValue(value, i); } return(arr); } // collections var iCollection = type.GetInterfaces().Where(t => t.Name.StartsWith(nameof(ICollection) + "`") && t.GenericTypeArguments.Length == 1).FirstOrDefault(); if (iCollection != null) { var elemType = iCollection.GenericTypeArguments[0]; var col = Activator.CreateInstance(type); var addMethod = col.GetType().GetMethod("Add", new Type[] { elemType }); foreach (var item in array) { var value = ConvertItemToValue(elemType, item); addMethod.Invoke(col, new object[] { value }); } return(col); } throw new Exception($"Failed to deserialize array into type '{type.FullName}'. Please provide a custom converter if you want this type to be deserializable."); }
public void Write(OMCLArray obj) { _writer.Write("["); if (obj.Empty) { _writer.WriteLine("]"); return; } _writer.WriteLine(); foreach (var val in obj) { Indent(1); WriteValue(val); } Indent(); _writer.WriteLine("]"); }
public OMCLItem(OMCLArray item) { _value = item; Type = OMCLItemType.Array; }
public void Add(OMCLArray item) { Add(new OMCLItem(item)); }