PropBehavior.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Masuit.Tools.Dynamics.Behaviors;
  5. internal class PropBehavior : ClayBehavior
  6. {
  7. private readonly Dictionary<string, object> _props = new();
  8. /// <inheritdoc />
  9. public override object GetMembers(Func<object> proceed, object self, IDictionary<string, object> members)
  10. {
  11. foreach (var pair in _props)
  12. {
  13. members.Add(pair.Key, pair.Value);
  14. }
  15. return proceed();
  16. }
  17. /// <inheritdoc />
  18. public override object GetMemberMissing(Func<object> proceed, object self, string name)
  19. {
  20. return _props.TryGetValue(name, out var value) ? value : null;
  21. }
  22. /// <inheritdoc />
  23. public override object SetMemberMissing(Func<object> proceed, object self, string name, object value)
  24. {
  25. return _props[name] = value;
  26. }
  27. /// <inheritdoc />
  28. public override object InvokeMemberMissing(Func<object> proceed, object self, string name, INamedEnumerable<object> args)
  29. {
  30. if (!args.Any())
  31. {
  32. return GetMemberMissing(proceed, self, name);
  33. }
  34. if (args.Count() == 1)
  35. {
  36. SetMemberMissing(proceed, self, name, args.Single());
  37. return self;
  38. }
  39. return proceed();
  40. }
  41. /// <inheritdoc />
  42. public override object GetIndex(Func<object> proceed, object self, IEnumerable<string> keys)
  43. {
  44. var list = keys.ToList();
  45. if (list.Count != 1) proceed();
  46. return _props.TryGetValue(list[0], out var value) ? value : null;
  47. }
  48. /// <inheritdoc />
  49. public override object SetIndex(Func<object> proceed, object self, IEnumerable<string> keys, object value)
  50. {
  51. var list = keys.ToList();
  52. if (list.Count != 1) proceed();
  53. return _props[list[0]] = value;
  54. }
  55. public Dictionary<string, object> GetProps()
  56. {
  57. return _props;
  58. }
  59. }