Arguments.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. namespace Masuit.Tools.Dynamics.Implementation;
  6. internal static class Arguments
  7. {
  8. public static INamedEnumerable<T> FromT<T>(IEnumerable<T> arguments, IEnumerable<string> names)
  9. {
  10. return new NamedEnumerable<T>(arguments, names);
  11. }
  12. public static INamedEnumerable<object> From(IEnumerable<object> arguments, IEnumerable<string> names)
  13. {
  14. return new NamedEnumerable<object>(arguments, names);
  15. }
  16. private class NamedEnumerable<T> : INamedEnumerable<T>
  17. {
  18. private readonly IEnumerable<T> _arguments;
  19. private readonly IEnumerable<string> _names;
  20. public NamedEnumerable(IEnumerable<T> arguments, IEnumerable<string> names)
  21. {
  22. if (arguments == null)
  23. {
  24. throw new ArgumentNullException(nameof(arguments));
  25. }
  26. if (names == null)
  27. {
  28. throw new ArgumentNullException(nameof(names));
  29. }
  30. var list = arguments.ToList();
  31. var nameList = names.ToList();
  32. if (list.Count < nameList.Count)
  33. {
  34. throw new ArgumentException("arguments.Count() < names.Count()");
  35. }
  36. _arguments = list;
  37. _names = nameList;
  38. }
  39. IEnumerator IEnumerable.GetEnumerator()
  40. {
  41. return _arguments.GetEnumerator();
  42. }
  43. IEnumerator<T> IEnumerable<T>.GetEnumerator()
  44. {
  45. return _arguments.GetEnumerator();
  46. }
  47. IEnumerable<T> INamedEnumerable<T>.Positional => _arguments.Take(_arguments.Count() - _names.Count());
  48. IDictionary<string, T> INamedEnumerable<T>.Named => new Named(_arguments, _names);
  49. private class Named : IDictionary<string, T>
  50. {
  51. private readonly IEnumerable<T> _arguments;
  52. private readonly IEnumerable<string> _names;
  53. private ICollection<T> _argumentsCollection;
  54. private ICollection<string> _namesCollection;
  55. public Named(IEnumerable<T> arguments, IEnumerable<string> names)
  56. {
  57. _arguments = arguments.Skip(arguments.Count() - names.Count());
  58. _names = names;
  59. }
  60. private IEnumerable<KeyValuePair<string, T>> MakeEnumerable()
  61. {
  62. return _arguments.Zip(_names, (arg, name) => new KeyValuePair<string, T>(name, arg));
  63. }
  64. IEnumerator<KeyValuePair<string, T>> IEnumerable<KeyValuePair<string, T>>.GetEnumerator()
  65. {
  66. return MakeEnumerable().GetEnumerator();
  67. }
  68. IEnumerator IEnumerable.GetEnumerator()
  69. {
  70. return MakeEnumerable().GetEnumerator();
  71. }
  72. void ICollection<KeyValuePair<string, T>>.Add(KeyValuePair<string, T> item)
  73. {
  74. throw new NotImplementedException();
  75. }
  76. void ICollection<KeyValuePair<string, T>>.Clear()
  77. {
  78. throw new NotImplementedException();
  79. }
  80. bool ICollection<KeyValuePair<string, T>>.Contains(KeyValuePair<string, T> item)
  81. {
  82. return MakeEnumerable().Contains(item);
  83. }
  84. void ICollection<KeyValuePair<string, T>>.CopyTo(KeyValuePair<string, T>[] array, int arrayIndex)
  85. {
  86. throw new NotImplementedException();
  87. }
  88. bool ICollection<KeyValuePair<string, T>>.Remove(KeyValuePair<string, T> item)
  89. {
  90. throw new NotImplementedException();
  91. }
  92. int ICollection<KeyValuePair<string, T>>.Count => _names.Count();
  93. bool ICollection<KeyValuePair<string, T>>.IsReadOnly => true;
  94. bool IDictionary<string, T>.ContainsKey(string key)
  95. {
  96. return _names.Contains(key);
  97. }
  98. void IDictionary<string, T>.Add(string key, T value)
  99. {
  100. throw new NotImplementedException();
  101. }
  102. bool IDictionary<string, T>.Remove(string key)
  103. {
  104. throw new NotImplementedException();
  105. }
  106. bool IDictionary<string, T>.TryGetValue(string key, out T value)
  107. {
  108. var pair = MakeEnumerable().FirstOrDefault(kv => kv.Key == key);
  109. value = pair.Value;
  110. return pair.Key != null;
  111. }
  112. T IDictionary<string, T>.this[string key]
  113. {
  114. get
  115. {
  116. return MakeEnumerable().Where(kv => kv.Key == key).Select(kv => kv.Value).FirstOrDefault();
  117. }
  118. set => throw new NotImplementedException();
  119. }
  120. ICollection<string> IDictionary<string, T>.Keys
  121. {
  122. get
  123. {
  124. return _namesCollection ??= _names as ICollection<string> ?? _names.ToArray();
  125. }
  126. }
  127. ICollection<T> IDictionary<string, T>.Values
  128. {
  129. get
  130. {
  131. return _argumentsCollection ??= _arguments as ICollection<T> ?? _arguments.ToArray();
  132. }
  133. }
  134. }
  135. }
  136. public static INamedEnumerable<object> Empty()
  137. {
  138. return From(Enumerable.Empty<object>(), Enumerable.Empty<string>());
  139. }
  140. }