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.

131 lines
3.3 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
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 trimKey = false) : base(trimKey) { }
  15. }
  16. /// <summary>字典模型。</summary>
  17. [Serializable]
  18. public partial class ObjectSet<T> : IToJson
  19. {
  20. private Dictionary<string, T> _origin;
  21. private bool _trimkey = false;
  22. private bool _locked = false;
  23. /// <summary>获取或设置字典内容。</summary>
  24. public T this[string key] { get { return Get(key); } set { Set(key, value); } }
  25. /// <summary>获取字典。</summary>
  26. internal Dictionary<string, T> Origin { get { return _origin; } }
  27. internal bool Locked { get { return _locked; } set { _locked = value; } }
  28. internal bool TrimKey { get { return _trimkey; } set { _trimkey = value; } }
  29. /// <summary>构造函数。</summary>
  30. public ObjectSet(bool trimKey = false)
  31. {
  32. _trimkey = trimKey;
  33. _origin = new Dictionary<string, T>();
  34. }
  35. private T Get(string key)
  36. {
  37. var contains = false;
  38. return Get(key, ref contains);
  39. }
  40. private T Get(string key, ref bool contains)
  41. {
  42. var value = default(T);
  43. if (key != null)
  44. {
  45. var k = _trimkey ? Trim(key) : key;
  46. lock (_origin)
  47. {
  48. contains = _origin.ContainsKey(k);
  49. if (contains) value = _origin[k];
  50. }
  51. }
  52. return value;
  53. }
  54. private bool Set(string key, T value)
  55. {
  56. if (_locked) return false;
  57. var success = false;
  58. if (key != null)
  59. {
  60. var k = _trimkey ? Trim(key) : key;
  61. lock (_origin)
  62. {
  63. if (_origin.ContainsKey(k)) _origin[k] = value;
  64. else _origin.Add(k, value);
  65. success = true;
  66. }
  67. }
  68. return success;
  69. }
  70. /// <summary>转换为 <see cref="Json"/> 对象。</summary>
  71. public Json ToJson() => Json.From(_origin);
  72. /// <summary>转换为 <see cref="Json"/> 字符串。</summary>
  73. public override string ToString()
  74. {
  75. var json = ToJson();
  76. if (json == null) return null;
  77. return json.ToString(true);
  78. }
  79. }
  80. #if !NET20
  81. /// <summary>字典模型。</summary>
  82. public partial class ObjectSet<T> : DynamicObject
  83. {
  84. public override IEnumerable<string> GetDynamicMemberNames()
  85. {
  86. return new List<string>(_origin.Keys).ToArray();
  87. }
  88. /// <summary></summary>
  89. public override bool TryGetMember(GetMemberBinder binder, out object result)
  90. {
  91. var contains = false;
  92. result = Get(binder.Name, ref contains);
  93. return contains;
  94. }
  95. /// <summary></summary>
  96. public override bool TrySetMember(SetMemberBinder binder, object value)
  97. {
  98. return Set(binder.Name, (T)value);
  99. }
  100. }
  101. #endif
  102. }