You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
3.3 KiB
141 lines
3.3 KiB
using Apewer.Internals;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
#if !NET20
|
|
using System.Dynamic;
|
|
#endif
|
|
|
|
namespace Apewer
|
|
{
|
|
|
|
/// <summary>对象字典模型。</summary>
|
|
[Serializable]
|
|
public class ObjectSet : ObjectSet<object>
|
|
{
|
|
|
|
/// <summary></summary>
|
|
public ObjectSet(bool autoTrim)
|
|
{
|
|
AutoTrim = autoTrim;
|
|
}
|
|
|
|
/// <summary></summary>
|
|
public ObjectSet() { }
|
|
|
|
}
|
|
|
|
/// <summary>字典模型。</summary>
|
|
[Serializable]
|
|
public partial class ObjectSet<T> // where T : class
|
|
{
|
|
|
|
[NonSerialized]
|
|
private readonly T Default = default(T);
|
|
|
|
private Dictionary<string, T> _origin;
|
|
|
|
private bool _autotrim = false;
|
|
|
|
private bool _locked = false;
|
|
|
|
/// <summary>获取或设置字典内容。</summary>
|
|
public T this[string key]
|
|
{
|
|
get { return Get(key); }
|
|
set { Set(key, value); }
|
|
}
|
|
|
|
/// <summary>获取字典。</summary>
|
|
internal Dictionary<string, T> Origin
|
|
{
|
|
get { return _origin; }
|
|
}
|
|
|
|
internal bool Locked { get { return _locked; } set { _locked = value; } }
|
|
|
|
internal bool AutoTrim { get { return _autotrim; } set { _autotrim = value; } }
|
|
|
|
/// <summary>构造函数。</summary>
|
|
public ObjectSet()
|
|
{
|
|
_origin = new Dictionary<string, T>();
|
|
}
|
|
|
|
/// <summary>构造函数。</summary>
|
|
public ObjectSet(bool autoTrim)
|
|
{
|
|
_autotrim = autoTrim;
|
|
_origin = new Dictionary<string, T>();
|
|
}
|
|
|
|
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 = _autotrim ? TextModifier.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 = _autotrim ? TextModifier.Trim(key) : key;
|
|
lock (_origin)
|
|
{
|
|
if (_origin.ContainsKey(k))
|
|
{
|
|
_origin[k] = value;
|
|
}
|
|
else
|
|
{
|
|
_origin.Add(k, value);
|
|
}
|
|
success = true;
|
|
}
|
|
}
|
|
return success;
|
|
}
|
|
|
|
}
|
|
|
|
#if !NET20
|
|
|
|
/// <summary>字典模型。</summary>
|
|
public partial class ObjectSet<T> : DynamicObject
|
|
{
|
|
|
|
/// <summary></summary>
|
|
public override bool TryGetMember(GetMemberBinder binder, out object result)
|
|
{
|
|
var contains = false;
|
|
result = Get(binder.Name, ref contains);
|
|
return contains;
|
|
}
|
|
|
|
/// <summary></summary>
|
|
public override bool TrySetMember(SetMemberBinder binder, object value)
|
|
{
|
|
return Set(binder.Name, (T)value);
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|