Clay.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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 : IDynamicMetaObjectProvider, IClayBehaviorProvider
  9. {
  10. private readonly ClayBehaviorCollection _behavior;
  11. public Clay() : this(Enumerable.Empty<IClayBehavior>())
  12. {
  13. }
  14. public Clay(params IClayBehavior[] behaviors) : this(behaviors.AsEnumerable())
  15. {
  16. }
  17. public Clay(IEnumerable<IClayBehavior> behaviors)
  18. {
  19. _behavior = new ClayBehaviorCollection(behaviors);
  20. }
  21. DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter)
  22. {
  23. return new ClayMetaObject(this, parameter);
  24. }
  25. IClayBehavior IClayBehaviorProvider.Behavior => _behavior;
  26. /// <inheritdoc />
  27. public override string ToString()
  28. {
  29. var fallback = base.ToString();
  30. return _behavior.InvokeMember(() => fallback, this, "ToString", Arguments.Empty()) as string ?? string.Empty;
  31. }
  32. public Dictionary<string, object> ToDictionary()
  33. {
  34. return _behavior.OfType<PropBehavior>().First().GetProps();
  35. }
  36. /// <summary>
  37. /// 移除属性
  38. /// </summary>
  39. /// <param name="left"></param>
  40. /// <param name="right"></param>
  41. public static Clay operator -(Clay left, string right)
  42. {
  43. left.ToDictionary().Remove(right);
  44. return left;
  45. }
  46. }