using System; using System.Collections.Generic; using static Apewer.TextUtility; #if !NET20 using System.Dynamic; #endif namespace Apewer { /// 对象字典模型。 [Serializable] public class ObjectSet : ObjectSet { /// 构造函数。 /// 引用指定的字典,指定 NULL 时创建新字典。 /// 对动态属性的访问始终返回 TRUE 值。 public ObjectSet(Dictionary dictionary, bool always = false) : base(dictionary, always) { } /// /// 使用 get 和 set 访问器时候修建 Key。 /// 对动态属性的访问始终返回 TRUE 值。 public ObjectSet(bool trimKey = false, bool always = false) : base(trimKey, always) { } } /// 字典模型。 [Serializable] public partial class ObjectSet : IToJson { private Dictionary _origin; private bool _trimkey = false; private bool _locked = false; internal bool _always = false; /// 获取或设置字典内容。 public T this[string key] { get { return Get(key); } set { Set(key, value); } } /// 获取字典。 internal Dictionary Origin { get { return _origin; } } internal bool Locked { get { return _locked; } set { _locked = value; } } internal bool TrimKey { get { return _trimkey; } set { _trimkey = value; } } /// 构造函数。 /// 引用指定的字典,指定 NULL 时创建新字典。 /// 对动态属性的访问始终返回 TRUE 值。 public ObjectSet(Dictionary dictionary, bool always = false) { _trimkey = false; _always = always; _origin = dictionary ?? new Dictionary(); } /// 构造函数。 /// 使用 get 和 set 访问器时候修建 Key。 /// 对动态属性的访问始终返回 TRUE 值。 public ObjectSet(bool trimKey = false, bool always = false) { _trimkey = trimKey; _always = always; _origin = new Dictionary(); } private T Get(string key) { var contains = false; return Get(key, ref contains); } private T Get(string key, ref bool contains) { var value = default(T); if (key != null) { var k = _trimkey ? Trim(key) : key; lock (_origin) { contains = _origin.ContainsKey(k); if (contains) value = _origin[k]; } } return value; } private bool Set(string key, T value) { if (_locked) return false; var success = false; if (key != null) { var k = _trimkey ? Trim(key) : key; lock (_origin) { if (_origin.ContainsKey(k)) _origin[k] = value; else _origin.Add(k, value); success = true; } } return success; } /// 转换为 对象。 public Json ToJson() => Json.From(_origin); /// 转换为 字符串。 public override string ToString() { var json = ToJson(); if (json == null) return null; return json.ToString(true); } } #if !NET20 /// 字典模型。 public partial class ObjectSet : DynamicObject { /// public override IEnumerable GetDynamicMemberNames() { return new List(_origin.Keys).ToArray(); } /// public override bool TryGetMember(GetMemberBinder binder, out object result) { var contains = false; result = Get(binder.Name, ref contains); if (_always) return true; return contains; } /// public override bool TrySetMember(SetMemberBinder binder, object value) { var setted = Set(binder.Name, (T)value); if (_always) return true; return setted; } internal static ExpandoObject Expando(ObjectSet os) { if (os == null) return null; var eo = new ExpandoObject(); var dict = eo as IDictionary; foreach (var kvp in os._origin) dict.Add(kvp.Key, kvp.Value); return eo; } internal static ExpandoObject[] Expando(ObjectSet[] oss) { if (oss == null) return null; var eos = new ExpandoObject[oss.Length]; for (var i = 0; i < oss.Length; i++) eos[i] = Expando(oss[i]); return eos; } } #endif }