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.

140 lines
3.3 KiB

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