| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- using System;
- using System.Collections.Generic;
- using System.Reflection;
- using System.Text;
- using UnityEngine;
- namespace Game.Config
- {
- public class ExcelParser
- {
- public static T Serializable<T>(string[] fields, string[] data) where T : GameData
- {
- Type type = typeof(T);
- T obj = Activator.CreateInstance<T>();
- int length = fields.Length;
- for (int i = 0; i < length; i++)
- {
- FieldInfo field = type.GetField(fields[i]);
-
-
- object value = GetSetFieldValue(field.FieldType, data[i]);
- //Debug.Log(value);
- field.SetValue(obj, value);
- }
- return obj;
- }
- public static GameData Serializable(Type type, string[] fields, string[] data)
- {
- GameData obj = (GameData)Activator.CreateInstance(type);
- int length = fields.Length;
- for (int i = 0; i < length; i++)
- {
- FieldInfo field = type.GetField(fields[i]);
- object value = GetSetFieldValue(field.FieldType, data[i]);
- field.SetValue(obj, value);
- }
- return obj;
- }
- public static string[] Deserialize(Type type, GameData data, string[] fields)
- {
- int length = fields.Length;
- string[] ret = new string[length];
- for (int i = 0; i < length; i++)
- {
- FieldInfo fieldInfo = type.GetField(fields[i]);
- if (!fieldInfo.FieldType.GetTypeInfo().IsGenericType)
- {
- ret[i] = fieldInfo.GetValue(data).ToString();
- }
- else
- {
- ret[i] = GetCompositeValueString(data, fieldInfo);
- }
- }
- return ret;
- }
- private static string GetCompositeValueString(GameData data, FieldInfo fieldInfo)
- {
- StringBuilder ret = new StringBuilder();
- object obj = fieldInfo.GetValue(data);
- Type type = fieldInfo.FieldType.GetGenericTypeDefinition();
- if (type == typeof(List<>))
- {
- GetListValueString(ret, fieldInfo.FieldType, obj);
- }
- else if (type == typeof(Dictionary<,>))
- {
- GetDictionaryValueString(ret, fieldInfo.FieldType, obj);
- }
- return ret.ToString();
- }
- private static void GetDictionaryValueString(StringBuilder stringBuilder, Type fieldType, object obj)
- {
- // 获取Dictionary的Count属性信息
- PropertyInfo countPropertyInfo = fieldType.GetProperty("Count");
- // 获取Dictionary的元素数量
- int count = (int)countPropertyInfo.GetValue(obj);
- // 获取Dictionary的Item属性信息
- PropertyInfo itemPropertyInfo = fieldType.GetProperty("Item");
- PropertyInfo keysPropertyInfo = fieldType.GetProperty("Keys");
- object keys = keysPropertyInfo.GetValue(obj);
- object keyenumerator = keys.GetType().GetMethod("GetEnumerator").Invoke(keys, null);
- Type keyenumeratorType = keyenumerator.GetType();
- MethodInfo keyenumeratorMoveNext = keyenumeratorType.GetMethod("MoveNext");
- PropertyInfo keyenumeratorCurrent = keyenumeratorType.GetProperty("Current");
- int i = 0;
- while ((bool)keyenumeratorMoveNext.Invoke(keyenumerator, null))
- {
- object key = keyenumeratorCurrent.GetValue(keyenumerator);
- object value = itemPropertyInfo.GetValue(obj, new object[] { key });
-
- if (i < count - 1)
- {
- stringBuilder.AppendFormat("{0}|{1}|",key.ToString(), value.ToString());
- }
- else
- {
- stringBuilder.AppendFormat("{0}|{1}", key.ToString(), value.ToString());
- }
- i++;
- }
- }
- private static void GetListValueString(StringBuilder stringBuilder, Type fieldType, object obj)
- {
- // 获取List的Count属性信息
- PropertyInfo countPropertyInfo = fieldType.GetProperty("Count");
- // 获取List的Item属性信息
- PropertyInfo itemPropertyInfo = fieldType.GetProperty("Item");
- // 获取List的元素数量
- int count = (int)countPropertyInfo.GetValue(obj);
- // 遍历List并获取存储的数据
- for (int i = 0; i < count; i++)
- {
- // 使用Item属性获取元素
- object value = itemPropertyInfo.GetValue(obj, new object[] { i });
- if (i < count - 1)
- {
- stringBuilder.AppendFormat("{0}|", value.ToString());
- }
- else
- {
- stringBuilder.Append(value.ToString());
- }
- }
- }
- public static string[] Deserialize<T>(T data, string[] fields) where T : GameData
- {
- return Deserialize(typeof(T), data, fields);
- }
- public static object GetSetFieldValue(Type fieldType, string value)
- {
- object setvalue = new object();
- switch (fieldType.ToString())
- {
- case "Int32":
- case "System.Int32":
- setvalue = int.Parse(value);
- break;
- case "System.Int64":
- case "Int64":
- setvalue = long.Parse(value);
- break;
- case "System.UInt64":
- case "UInt64":
- setvalue = ulong.Parse(value);
- break;
- case "Single":
- case "System.Single":
- setvalue = float.Parse(value);
- break;
- case "System.Double":
- case "Double":
- setvalue = double.Parse(value);
- break;
- case "System.Boolean":
- case "Boolean":
- setvalue = bool.Parse(value);
- break;
- case "System.String":
- case "String":
- setvalue = value;
- break;
- //case "System.Int32": setvalue = int.Parse(value); break;
- // 新加
- default:
- setvalue = GetSetComPositeTypeFieldValue(setvalue, fieldType, value);
- break;
- }
- return setvalue;
- }
- public static object GetSetComPositeTypeFieldValue(object obj, Type fieldType, string value)
- {
- Type type = fieldType;
- if (!type.GetTypeInfo().IsGenericType)
- {
- return obj;
- }
- Type genericType = type.GetGenericTypeDefinition();
- string[] datas = value.Split('|');
- if (datas.Length <= 0)
- {
- return obj;
- }
- if (typeof(List<>) == genericType)
- {
- obj = SetListTypeFieldValue(obj, type, datas);
- }
- else if (typeof(Dictionary<,>) == genericType)
- {
- obj = SetDictionaryTypeFieldValue(obj, type, datas);
- }
- return obj;
- }
- private static object SetDictionaryTypeFieldValue(object obj, Type fieldType, string[] values)
- {
- obj = Activator.CreateInstance(fieldType);
- Type[] agtypes = fieldType.GetGenericArguments();
- Type keyType = agtypes[0];
- Type valueType = agtypes[1];
- MethodInfo method = fieldType.GetMethod("Add");
- if (method != null)
- {
- int len = values.Length;
- for (int i = 0; i < len; i += 2)
- {
- object key = GetSetFieldValue(keyType, values[i]);
- object value = GetSetFieldValue(valueType, values[i + 1]);
- method.Invoke(obj, new object[] { key, value });
- }
- }
- return obj;
- }
- private static object SetListTypeFieldValue(object obj, Type fieldType, string[] values)
- {
- obj = Activator.CreateInstance(fieldType);
- Type gatype = fieldType.GetGenericArguments()[0];
- MethodInfo method = fieldType.GetMethod("Add");
- if (method != null)
- {
- int len = values.Length;
- for (int i = 0; i < len; i++)
- {
- object value = GetSetFieldValue(gatype, values[i]);
- method.Invoke(obj, new object[] { value });
- }
- }
- return obj;
- }
- }
- }
|