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.

145 lines
3.9 KiB

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