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

  1. using Apewer.Internals;
  2. using System;
  3. using System.Collections.Generic;
  4. #if !NET20
  5. using System.Dynamic;
  6. #endif
  7. namespace Apewer
  8. {
  9. /// <summary>对象字典模型。</summary>
  10. [Serializable]
  11. public class ObjectSet : ObjectSet<object>
  12. {
  13. /// <summary></summary>
  14. public ObjectSet(bool autotrim)
  15. {
  16. AutoTrim = autotrim;
  17. }
  18. /// <summary></summary>
  19. public ObjectSet() { }
  20. }
  21. /// <summary>字典模型。</summary>
  22. [Serializable]
  23. public partial class ObjectSet<T> // where T : class
  24. {
  25. [NonSerialized]
  26. private readonly T Default = default(T);
  27. private Dictionary<string, T> _origin;
  28. private bool _autotrim = false;
  29. private bool _locked = false;
  30. /// <summary>获取或设置字典内容。</summary>
  31. public T this[string key]
  32. {
  33. get { return Get(key); }
  34. set { Set(key, value); }
  35. }
  36. /// <summary>获取字典。</summary>
  37. internal Dictionary<string, T> Origin
  38. {
  39. get { return _origin; }
  40. }
  41. internal bool Locked { get { return _locked; } set { _locked = value; } }
  42. internal bool AutoTrim { get { return _autotrim; } set { _autotrim = value; } }
  43. /// <summary>构造函数。</summary>
  44. public ObjectSet()
  45. {
  46. _origin = new Dictionary<string, T>();
  47. }
  48. /// <summary>构造函数。</summary>
  49. public ObjectSet(bool autotrim)
  50. {
  51. _autotrim = autotrim;
  52. _origin = new Dictionary<string, T>();
  53. }
  54. private T Get(string key)
  55. {
  56. var contains = false;
  57. return Get(key, ref contains);
  58. }
  59. private T Get(string key, ref bool contains)
  60. {
  61. var value = default(T);
  62. if (key != null)
  63. {
  64. var k = _autotrim ? TextModifier.Trim(key) : key;
  65. lock (_origin)
  66. {
  67. contains = _origin.ContainsKey(k);
  68. if (contains) value = _origin[k];
  69. }
  70. }
  71. return value;
  72. }
  73. private bool Set(string key, T value)
  74. {
  75. if (_locked) return false;
  76. var success = false;
  77. if (key != null)
  78. {
  79. var k = _autotrim ? TextModifier.Trim(key) : key;
  80. lock (_origin)
  81. {
  82. if (_origin.ContainsKey(k))
  83. {
  84. _origin[k] = value;
  85. }
  86. else
  87. {
  88. _origin.Add(k, value);
  89. }
  90. success = true;
  91. }
  92. }
  93. return success;
  94. }
  95. }
  96. #if !NET20
  97. /// <summary>字典模型。</summary>
  98. public partial class ObjectSet<T> : DynamicObject
  99. {
  100. /// <summary></summary>
  101. public override bool TryGetMember(GetMemberBinder binder, out object result)
  102. {
  103. var contains = false;
  104. result = Get(binder.Name, ref contains);
  105. return contains;
  106. }
  107. /// <summary></summary>
  108. public override bool TrySetMember(SetMemberBinder binder, object value)
  109. {
  110. return Set(binder.Name, (T)value);
  111. }
  112. }
  113. #endif
  114. }