using UnityEngine; using System.Xml; using System.Collections.Generic; using System; /// /// 配置Item类 /// public interface IConfigItem { string GetKey(); bool Parse(XmlNode node); } public abstract class ConfigItem { public const string KeySpan = "_"; public abstract string GetKey(); public virtual void OnItemParsed() { } public virtual bool Parse(XmlNode node) { object self = this; var result = ObjectParser.Parse(node, ref self, this.GetType()); OnItemParsed(); return result == ObjectParser.Result.OK; } } public class ConfigFile where T : ConfigItem { protected Dictionary m_items = new Dictionary(); public ConfigFile(string filePath) { XmlDocument doc = null; doc = XMLUtil.GetEssentialXmlCfg(filePath); if(null == doc) { GameLogger.LogError("Read Cfg Error, null == doc, path: " + filePath); } if (!InitFile(doc)) { GameLogger.LogError("Init Config File Error filePath = " + filePath); } } public bool InitFile(XmlDocument doc) { XmlNodeList nodeList = doc.GetElementsByTagName("item"); string errorStr = ""; int count = nodeList.Count; for (int i = 0; i < count; i++) { XmlNode node = nodeList[i]; T obj = (T)Activator.CreateInstance(typeof(T));//ReflectionUtils.CreateInstance(typeof(T)); if (!obj.Parse(node)) { errorStr += ObjectParser.lastError; } var key = obj.GetKey(); if (!m_items.ContainsKey(key)) m_items.Add(key, obj); else GameLogger.LogError(string.Format("cfg has contains the same key,key:{0}", key)); } if (!string.IsNullOrEmpty(errorStr)) { Debug.LogError("InitFile error " + errorStr); return false; } else if (count == 0) { string baseUrl = doc.BaseURI; int index = baseUrl.LastIndexOf('/'); baseUrl = baseUrl.Substring(index + 1); Debug.LogError("Cannot find Elements item, file name = " + baseUrl); return false; } else { return true; } } public T GetItem(string key) { T item = null; m_items.TryGetValue(key, out item); return item; } public Dictionary GetAllItems() { return m_items; } }