object ReadList() { object ret = ReadObject(); //Type t = ret.GetType().GetInterfaces().Where(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IList<>)).First(); Type t = ret.GetType(); DynamicMethodDelegate dmd = DynamicMethodDelegateFactory.CreateDelegate(t.GetMethod("Add", BindingFlags.Instance | BindingFlags.Public, null, t.GetGenericArguments(), null)); TypeMarker elemt = (TypeMarker)reader.ReadByte(); int len = (int)ReadVInt(); if (TypeMarkerUtil.IsFinal(elemt)) { for (int i = 0; i < len; i++) { dmd(ret, new[] { ReadValue(elemt) }); } } else { for (int i = 0; i < len; i++) { dmd(ret, new[] { ReadValue() }); } } return(ret); }
object ReadDictionary() { object ret = ReadObject(); Type t = ret.GetType().GetInterfaces().Where(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IDictionary <,>)).First(); DynamicMethodDelegate dmd = DynamicMethodDelegateFactory.CreateDelegate(t.GetMethod("Add", BindingFlags.Instance | BindingFlags.Public, null, t.GetGenericArguments(), null)); int len = (int)ReadVInt(); object[] keys = new object[len]; for (int i = 0; i < len; i++) { keys[i] = ReadValue(); } for (int i = 0; i < len; i++) { dmd(ret, new[] { keys[i], ReadValue() }); } return(ret); }