ExcelParser.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using System.Text;
  5. using UnityEngine;
  6. namespace Game.Config
  7. {
  8. public class ExcelParser
  9. {
  10. public static T Serializable<T>(string[] fields, string[] data) where T : GameData
  11. {
  12. Type type = typeof(T);
  13. T obj = Activator.CreateInstance<T>();
  14. int length = fields.Length;
  15. for (int i = 0; i < length; i++)
  16. {
  17. FieldInfo field = type.GetField(fields[i]);
  18. if (field != null)
  19. {
  20. if (data.Length > i)
  21. {
  22. object value = GetSetFieldValue(field.FieldType, data[i]);
  23. //Debug.Log(value);
  24. field.SetValue(obj, value);
  25. }
  26. else
  27. {
  28. Debug.LogError("反射失败,检查数据:"+ data[0]);
  29. }
  30. }
  31. else
  32. {
  33. Debug.LogError("反射查找失败,检查数据:" + data[0]);
  34. }
  35. }
  36. return obj;
  37. }
  38. public static GameData Serializable(Type type, string[] fields, string[] data)
  39. {
  40. GameData obj = (GameData)Activator.CreateInstance(type);
  41. int length = fields.Length;
  42. for (int i = 0; i < length; i++)
  43. {
  44. FieldInfo field = type.GetField(fields[i]);
  45. object value = GetSetFieldValue(field.FieldType, data[i]);
  46. field.SetValue(obj, value);
  47. }
  48. return obj;
  49. }
  50. public static string[] Deserialize(Type type, GameData data, string[] fields)
  51. {
  52. int length = fields.Length;
  53. string[] ret = new string[length];
  54. for (int i = 0; i < length; i++)
  55. {
  56. FieldInfo fieldInfo = type.GetField(fields[i]);
  57. if (!fieldInfo.FieldType.GetTypeInfo().IsGenericType)
  58. {
  59. ret[i] = fieldInfo.GetValue(data).ToString();
  60. }
  61. else
  62. {
  63. ret[i] = GetCompositeValueString(data, fieldInfo);
  64. }
  65. }
  66. return ret;
  67. }
  68. private static string GetCompositeValueString(GameData data, FieldInfo fieldInfo)
  69. {
  70. StringBuilder ret = new StringBuilder();
  71. object obj = fieldInfo.GetValue(data);
  72. Type type = fieldInfo.FieldType.GetGenericTypeDefinition();
  73. if (type == typeof(List<>))
  74. {
  75. GetListValueString(ret, fieldInfo.FieldType, obj);
  76. }
  77. else if (type == typeof(Dictionary<,>))
  78. {
  79. GetDictionaryValueString(ret, fieldInfo.FieldType, obj);
  80. }
  81. return ret.ToString();
  82. }
  83. private static void GetDictionaryValueString(StringBuilder stringBuilder, Type fieldType, object obj)
  84. {
  85. // 获取Dictionary的Count属性信息
  86. PropertyInfo countPropertyInfo = fieldType.GetProperty("Count");
  87. // 获取Dictionary的元素数量
  88. int count = (int)countPropertyInfo.GetValue(obj);
  89. // 获取Dictionary的Item属性信息
  90. PropertyInfo itemPropertyInfo = fieldType.GetProperty("Item");
  91. PropertyInfo keysPropertyInfo = fieldType.GetProperty("Keys");
  92. object keys = keysPropertyInfo.GetValue(obj);
  93. object keyenumerator = keys.GetType().GetMethod("GetEnumerator").Invoke(keys, null);
  94. Type keyenumeratorType = keyenumerator.GetType();
  95. MethodInfo keyenumeratorMoveNext = keyenumeratorType.GetMethod("MoveNext");
  96. PropertyInfo keyenumeratorCurrent = keyenumeratorType.GetProperty("Current");
  97. int i = 0;
  98. while ((bool)keyenumeratorMoveNext.Invoke(keyenumerator, null))
  99. {
  100. object key = keyenumeratorCurrent.GetValue(keyenumerator);
  101. object value = itemPropertyInfo.GetValue(obj, new object[] { key });
  102. if (i < count - 1)
  103. {
  104. stringBuilder.AppendFormat("{0}|{1}|",key.ToString(), value.ToString());
  105. }
  106. else
  107. {
  108. stringBuilder.AppendFormat("{0}|{1}", key.ToString(), value.ToString());
  109. }
  110. i++;
  111. }
  112. }
  113. private static void GetListValueString(StringBuilder stringBuilder, Type fieldType, object obj)
  114. {
  115. // 获取List的Count属性信息
  116. PropertyInfo countPropertyInfo = fieldType.GetProperty("Count");
  117. // 获取List的Item属性信息
  118. PropertyInfo itemPropertyInfo = fieldType.GetProperty("Item");
  119. // 获取List的元素数量
  120. int count = (int)countPropertyInfo.GetValue(obj);
  121. // 遍历List并获取存储的数据
  122. for (int i = 0; i < count; i++)
  123. {
  124. // 使用Item属性获取元素
  125. object value = itemPropertyInfo.GetValue(obj, new object[] { i });
  126. if (i < count - 1)
  127. {
  128. stringBuilder.AppendFormat("{0}|", value.ToString());
  129. }
  130. else
  131. {
  132. stringBuilder.Append(value.ToString());
  133. }
  134. }
  135. }
  136. public static string[] Deserialize<T>(T data, string[] fields) where T : GameData
  137. {
  138. return Deserialize(typeof(T), data, fields);
  139. }
  140. public static object GetSetFieldValue(Type fieldType, string value)
  141. {
  142. object setvalue = new object();
  143. switch (fieldType.ToString())
  144. {
  145. case "Int32":
  146. case "System.Int32":
  147. setvalue = int.Parse(value);
  148. break;
  149. case "System.Int64":
  150. case "Int64":
  151. setvalue = long.Parse(value);
  152. break;
  153. case "System.UInt64":
  154. case "UInt64":
  155. setvalue = ulong.Parse(value);
  156. break;
  157. case "Single":
  158. case "System.Single":
  159. setvalue = float.Parse(value);
  160. break;
  161. case "System.Double":
  162. case "Double":
  163. setvalue = double.Parse(value);
  164. break;
  165. case "System.Boolean":
  166. case "Boolean":
  167. setvalue = bool.Parse(value);
  168. break;
  169. case "System.String":
  170. case "String":
  171. setvalue = value;
  172. break;
  173. //case "System.Int32": setvalue = int.Parse(value); break;
  174. // 新加
  175. default:
  176. setvalue = GetSetComPositeTypeFieldValue(setvalue, fieldType, value);
  177. break;
  178. }
  179. return setvalue;
  180. }
  181. public static object GetSetComPositeTypeFieldValue(object obj, Type fieldType, string value)
  182. {
  183. Type type = fieldType;
  184. if (!type.GetTypeInfo().IsGenericType)
  185. {
  186. return obj;
  187. }
  188. Type genericType = type.GetGenericTypeDefinition();
  189. string[] datas = value.Split('|');
  190. if (datas.Length <= 0)
  191. {
  192. return obj;
  193. }
  194. if (typeof(List<>) == genericType)
  195. {
  196. obj = SetListTypeFieldValue(obj, type, datas);
  197. }
  198. else if (typeof(Dictionary<,>) == genericType)
  199. {
  200. obj = SetDictionaryTypeFieldValue(obj, type, datas);
  201. }
  202. return obj;
  203. }
  204. private static object SetDictionaryTypeFieldValue(object obj, Type fieldType, string[] values)
  205. {
  206. obj = Activator.CreateInstance(fieldType);
  207. Type[] agtypes = fieldType.GetGenericArguments();
  208. Type keyType = agtypes[0];
  209. Type valueType = agtypes[1];
  210. MethodInfo method = fieldType.GetMethod("Add");
  211. if (method != null)
  212. {
  213. int len = values.Length;
  214. for (int i = 0; i < len; i += 2)
  215. {
  216. object key = GetSetFieldValue(keyType, values[i]);
  217. object value = GetSetFieldValue(valueType, values[i + 1]);
  218. method.Invoke(obj, new object[] { key, value });
  219. }
  220. }
  221. return obj;
  222. }
  223. private static object SetListTypeFieldValue(object obj, Type fieldType, string[] values)
  224. {
  225. obj = Activator.CreateInstance(fieldType);
  226. Type gatype = fieldType.GetGenericArguments()[0];
  227. MethodInfo method = fieldType.GetMethod("Add");
  228. if (method != null)
  229. {
  230. int len = values.Length;
  231. for (int i = 0; i < len; i++)
  232. {
  233. object value = GetSetFieldValue(gatype, values[i]);
  234. method.Invoke(obj, new object[] { value });
  235. }
  236. }
  237. return obj;
  238. }
  239. }
  240. }