コード例 #1
0
ファイル: GenericBuilder.cs プロジェクト: jwk000/CodeDump
 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));
         }
     }
 }