DyoMember.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System.Collections;
  2. using System.Text;
  3. namespace qmonlib.Dependencies.Object.Dynamic
  4. {
  5. public class DyoMember
  6. {
  7. #region *** Constants ***
  8. public const string PathSeparator = "/";
  9. public const string PathRoot = ".";
  10. #endregion
  11. #region *** Properties ***
  12. private long Id { get; }
  13. public ElementType Type { get; }
  14. private Dyo? Root { get; }
  15. private DyoMember? Parent { get; }
  16. public string Name { get; }
  17. public object? Value { get; private set; }
  18. public DyoMember[] Members => _members.ToArray();
  19. #endregion
  20. #region *** Fields ***
  21. private static long _idCnt;
  22. private IList<DyoMember> _members = new List<DyoMember>();
  23. #endregion
  24. #region *** Indexer ***
  25. public DyoMember this[string name] => Get(name);
  26. public DyoMember this[int ordinal] => _members.Skip(ordinal).First();
  27. #endregion
  28. #region *** Constructors ***
  29. public DyoMember(Dyo? root, ElementType type, DyoMember? parent, string name, object? value = null)
  30. {
  31. Id = root?.GetNextId() ?? -1;
  32. Type = type;
  33. Parent = parent;
  34. Root = root;
  35. Name = name;
  36. Value = value;
  37. }
  38. #endregion
  39. #region *** Operations ***
  40. public DyoMember Add(string name, ElementType elementType, object? value = null)
  41. {
  42. ThrowIfExists(name);
  43. var item = new DyoMember(Root ?? (Dyo)this, elementType, this, name, value);
  44. _members.Add(item);
  45. return item;
  46. }
  47. public void Remove(string name)
  48. {
  49. var item = Get(name);
  50. item.Clear();
  51. _members.Remove(item);
  52. }
  53. public void Clear()
  54. {
  55. foreach (var member in _members)
  56. member.Clear();
  57. _members.Clear();
  58. }
  59. public DyoMember Get(string name)
  60. {
  61. ThrowIfNotExists(name);
  62. var item = _members.First(x => x.Name == name);
  63. return item;
  64. }
  65. public void Set(string name, object? value)
  66. {
  67. var item = Get(name);
  68. item.Value = value;
  69. }
  70. public void Reset()
  71. {
  72. foreach (var member in _members)
  73. member.Reset();
  74. Value = null;
  75. }
  76. public bool Exists(string name, Dyo.ElementType? elementType = null)
  77. {
  78. if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
  79. var exists = elementType!=null ? _members.Any(x => x.Name == name && x.Type == elementType) : _members.Any(x => x.Name == name);
  80. return exists;
  81. }
  82. public string GetPath()
  83. {
  84. if (Parent == null) return Dyo.PathRoot;
  85. var path = Parent.GetPath() + Dyo.PathSeparator + Name;
  86. return path;
  87. }
  88. public string Dump()
  89. {
  90. var sb = new StringBuilder();
  91. sb.Append(Name).Append(" [#").Append(Id).Append(";").Append(Type).Append("] ").Append(_members.Count).Append(" members").AppendLine();
  92. sb.Append("\t").Append("Path:").Append(GetPath()).AppendLine();
  93. if (Type == ElementType.Value)
  94. sb.Append("\t").Append("Value:").Append(Value == null ? "NULL" : Value.ToString()).AppendLine();
  95. foreach (var member in _members)
  96. sb.Append("\t* ").Append(member.Dump());
  97. return sb.ToString();
  98. }
  99. #endregion
  100. #region *** Private Operations ***
  101. private void ThrowIfNotExists(string name)
  102. {
  103. if (!Exists(name)) throw new Exception($"Dyo member with name '{name}' does not exist.");
  104. }
  105. private void ThrowIfExists(string name)
  106. {
  107. if (Exists(name)) throw new Exception($"Dyo member with name '{name}' already exists.");
  108. }
  109. private long GetNextId()
  110. {
  111. _idCnt++;
  112. return _idCnt;
  113. }
  114. #endregion
  115. #region *** Nested Types ***
  116. public enum ElementType
  117. {
  118. Value,
  119. Object,
  120. Collection,
  121. Root
  122. }
  123. #endregion
  124. }
  125. }