static void push_class(object obj, BuffBuilder bb) { FieldInfo[] fields = obj.GetType().GetFields(); for (int i = 0; i < fields.Length; ++i) { if (fields[i].FieldType.IsPrimitive) { push_primitive(fields[i].GetValue(obj), fields[i].FieldType, bb); } else if (fields[i].FieldType.IsEnum) { push_primitive((int)fields[i].GetValue(obj), typeof(int), bb); } else if (fields[i].FieldType == typeof(string)) { string s = fields[i].GetValue(obj) as string; bb.PushString(s); } else if (fields[i].FieldType.IsArray) { System.Type elemtype = fields[i].FieldType.GetElementType(); if (elemtype.IsClass) { object[] objs = (object[])fields[i].GetValue(obj); bb.PushInt(objs.Length); for (int j = 0; j < objs.Length; ++j) { push_class(objs[j], bb); } } else if (elemtype.IsPrimitive) { object[] objs = (object[])fields[i].GetValue(obj); push_primitive_array(obj, objs.Length, fields[i], bb); } } else if (fields[i].FieldType.IsConstructedGenericType) { //处理dictionary if (fields[i].FieldType.Name == "Dictionary`2") { Type keyType = fields[i].FieldType.GenericTypeArguments[0]; if (!keyType.IsPrimitive) { throw new Exception("必须使用基础类型作为Dict的key"); } Type valueType = fields[i].FieldType.GenericTypeArguments[1]; MethodInfo countMethod = fields[i].FieldType.GetMethod("get_Count"); int length = (int)countMethod.Invoke(fields[i].GetValue(obj), null); bb.PushInt(length); //keys MethodInfo keysMethod = fields[i].FieldType.GetMethod("get_Keys"); ICollection kc = keysMethod.Invoke(fields[i].GetValue(obj), null) as ICollection; foreach (var k in kc) { push_primitive(k, keyType, bb); } //values MethodInfo valueMethod = fields[i].FieldType.GetMethod("get_Values"); ICollection vc = valueMethod.Invoke(fields[i].GetValue(obj), null) as ICollection; foreach (var v in vc) { push_class(v, bb); } } else if (fields[i].FieldType.Name == "List`1") { Type valueType = fields[i].FieldType.GenericTypeArguments[0]; MethodInfo countMethod = fields[i].FieldType.GetMethod("get_Count"); int length = (int)countMethod.Invoke(fields[i].GetValue(obj), null); bb.PushInt(length); //values ICollection c = fields[i].GetValue(obj) as ICollection; if (valueType.IsClass) { foreach (var e in c) { if (valueType == typeof(string)) { string s = e as string; bb.PushString(s); } else { push_class(e, bb); } } } else if (valueType.IsPrimitive) { foreach (var e in c) { push_primitive(e, valueType, bb); } } } else { throw new Exception("不支持的泛型序列化"); } } else if (fields[i].FieldType.IsClass) { object sub_obj = fields[i].GetValue(obj); push_class(sub_obj, bb); } else { throw new Exception(string.Format("不支持的序列化类型{0}", fields[i].FieldType.Name)); } } }