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
}