/// <summary>设置类型</summary> /// <param name="key"></param> /// <param name="value">数值</param> public void SetItem(String key, Object value) { if (value == null) { this[key] = String.Empty; return; } var t = value.GetType(); if (t.IsValueType || Type.GetTypeCode(t) == TypeCode.String || t == typeof(Object)) { this[key] = value.ToString(); return; } else if (value is IEnumerable) { var data = new ExtendData(); data.Root = key; IEnumerable list = value as IEnumerable; Int32 i = 1; foreach (var item in list) { data["Item" + i++.ToString()] = item.ToString(); } this[key] = data.ToXml(); if (XmlKeys == null) XmlKeys = new List<String>(); if (!XmlKeys.Contains(key)) XmlKeys.Add(key); return; } throw new XException(String.Format("不支持的类型{0},键{1},数据{2}", t, key, value)); }
/// <summary>取得指定键的强类型值</summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> public T GetItem <T>(String key) { if (!Contain(key)) { return(default(T)); } String value = this[key]; if (String.IsNullOrEmpty(value)) { return(default(T)); } Type t = typeof(T); if (t.IsValueType || Type.GetTypeCode(t) == TypeCode.String || t == typeof(Object)) { return((T)Convert.ChangeType(value, t)); } else if (t.IsArray || value is IEnumerable) { ExtendData data = FromXml(value); if (data == null) { throw new XException("ExtendData无法分析数据" + value); } List <String> list = new List <String>(); for (Int32 i = 1; i < Int32.MaxValue; i++) { if (!data.Contain("Item" + i.ToString())) { break; } list.Add(data["Item" + i.ToString()]); } return((T)Convert.ChangeType(list.ToArray(), t)); } throw new XException("不支持的类型{0},键{1}", typeof(T), key); }
/// <summary>从Xml转为具体数据</summary> /// <param name="xml"></param> /// <returns></returns> public static ExtendData FromXml(String xml) { if (String.IsNullOrEmpty(xml)) { return(null); } var doc = new XmlDocument(); try { doc.LoadXml(xml); } catch (XmlException ex) { XTrace.WriteLine("Xml数据异常!" + ex.Message + Environment.NewLine + xml); throw; } var extend = new ExtendData(); var root = doc.DocumentElement; extend.Root = root.Name; if (root.ChildNodes != null && root.ChildNodes.Count > 0) { foreach (XmlNode item in root.ChildNodes) { if (item.ChildNodes != null && (item.ChildNodes.Count > 1 || item.ChildNodes.Count == 1 && !(item.FirstChild is XmlText))) { extend[item.Name] = item.InnerXml; } else { extend[item.Name] = item.InnerText; } } } return(extend); }