public LSL_Types.list ParseValueToList(string inval, int start, out int end) { LSL_Types.list v = new LSL_Types.list(); end = -1; char c; string tr = ",}"; char[] charany = tr.ToCharArray(); string param = ""; int totlen = inval.Length; int len; while (true) { try { if (inval.Length == 0) v.Add(new LSL_Types.LSLString("")); else { c = inval[start++]; switch (c) { case 'i': end = inval.IndexOfAny(charany, start); if (end > 0) len = end - start; else len = totlen - start; param = inval.Substring(start, len); v.Add(new LSL_Types.LSLInteger(param)); break; case 'f': end = inval.IndexOfAny(charany, start); if (end > 0) len = end - start; else len = totlen - start; param = inval.Substring(start, len); v.Add(new LSL_Types.LSLFloat(param)); break; case 'v': end = inval.IndexOf('>', start); if (end > 0) len = end - start; else len = totlen - start; param = inval.Substring(start, len); v.Add(new LSL_Types.Vector3(param)); end++; break; case 'q': end = inval.IndexOf('>', start); if (end > 0) len = end - start; else len = totlen - start; param = inval.Substring(start, len); v.Add(new LSL_Types.Quaternion(param)); end++; break; case '"': end = inval.IndexOf('"', start); if (end > 0) len = end - start; else len = totlen - start; param = inval.Substring(start, len); v.Add(new LSL_Types.LSLString(param)); end++; break; case 'k': start++; end = inval.IndexOf('"', start); if (end > 0) len = end - start; else len = totlen - start; param = inval.Substring(start, len); v.Add(new LSL_Types.key(param)); end++; break; case '{': v.Add(ParseValueToList(inval, start, out end)); end++; break; default: break; } } start = end; if (start == -1 || start >= totlen || (inval[start] == '}')) break; else while (inval[start] == ',' || inval[start] == ' ') start++; } catch { } } return v; }
public Dictionary<string, object> GetVars() { Dictionary<string, object> vars = new Dictionary<string, object>(); Type t = GetType(); FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); foreach (FieldInfo field in fields) { if (field.FieldType == typeof(LSL_Types.list)) // ref type, copy { LSL_Types.list v = (LSL_Types.list)field.GetValue(this); if (((object)v) == null) continue;//Broken... :/ Object[] data = new Object[v.Data.Length]; Array.Copy(v.Data, 0, data, 0, v.Data.Length); LSL_Types.list c = new LSL_Types.list(); c.Data = data; vars[field.Name] = c; } else if (field.FieldType == typeof(LSL_Types.LSLInteger) || field.FieldType == typeof(LSL_Types.LSLString) || field.FieldType == typeof(LSL_Types.LSLFloat) || field.FieldType == typeof(Int32) || field.FieldType == typeof(Double) || field.FieldType == typeof(Single) || field.FieldType == typeof(String) || field.FieldType == typeof(Byte) || field.FieldType == typeof(short) || field.FieldType == typeof(LSL_Types.Vector3) || field.FieldType == typeof(LSL_Types.Quaternion)) { vars[field.Name] = field.GetValue(this); } } fields = null; t = null; return vars; }