Clay.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System.Collections.Generic;
  2. using System.Dynamic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using Masuit.Tools.Dynamics.Behaviors;
  6. using Masuit.Tools.Dynamics.Implementation;
  7. namespace Masuit.Tools.Dynamics;
  8. public class Clay(IEnumerable<IClayBehavior> behaviors) : IDynamicMetaObjectProvider, IClayBehaviorProvider
  9. {
  10. private readonly ClayBehaviorCollection _behavior = new(behaviors);
  11. public Clay() : this(Enumerable.Empty<IClayBehavior>())
  12. {
  13. }
  14. public Clay(params IClayBehavior[] behaviors) : this(behaviors.AsEnumerable())
  15. {
  16. }
  17. DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter)
  18. {
  19. return new ClayMetaObject(this, parameter);
  20. }
  21. IClayBehavior IClayBehaviorProvider.Behavior => _behavior;
  22. /// <inheritdoc />
  23. public override string ToString()
  24. {
  25. var fallback = base.ToString();
  26. return _behavior.InvokeMember(() => fallback, this, "ToString", Arguments.Empty()) as string ?? string.Empty;
  27. }
  28. public Dictionary<string, object> ToDictionary()
  29. {
  30. return _behavior.OfType<PropBehavior>().FirstOrDefault()?.GetProps();
  31. }
  32. /// <summary>
  33. /// 移除属性
  34. /// </summary>
  35. /// <param name="left"></param>
  36. /// <param name="right"></param>
  37. public static Clay operator -(Clay left, string right)
  38. {
  39. left.ToDictionary().Remove(right);
  40. return left;
  41. }
  42. /// <summary>
  43. /// 移除属性
  44. /// </summary>
  45. /// <param name="left"></param>
  46. /// <param name="right"></param>
  47. public static Clay operator +(Clay left, string right)
  48. {
  49. left[right] = DynamicFactory.NewObject();
  50. return left;
  51. }
  52. /// <summary>
  53. ///
  54. /// </summary>
  55. /// <param name="key"></param>
  56. public object this[string key]
  57. {
  58. get => ToDictionary()[key];
  59. set => ToDictionary()[key] = value;
  60. }
  61. }