ClayBehaviorCollection.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. namespace Masuit.Tools.Dynamics;
  6. internal class ClayBehaviorCollection(IEnumerable<IClayBehavior> behaviors) : List<IClayBehavior>(behaviors), IClayBehavior
  7. {
  8. private object Execute(Func<object> proceed, Func<Func<object>, IClayBehavior, Func<object>> linker)
  9. {
  10. return this.Aggregate(proceed, linker)();
  11. }
  12. /// <inheritdoc />
  13. public object GetMember(Func<object> proceed, object self, string name)
  14. {
  15. return Execute(proceed, (next, behavior) => () => behavior.GetMember(next, self, name));
  16. }
  17. public object SetMember(Func<object> proceed, object self, string name, object value)
  18. {
  19. return Execute(proceed, (next, behavior) => () => behavior.SetMember(next, self, name, value));
  20. }
  21. public object GetMembers(Func<object> proceed, object self, IDictionary<string, object> members)
  22. {
  23. return Execute(proceed, (next, behavior) => () => behavior.GetMembers(next, self, members));
  24. }
  25. public object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args)
  26. {
  27. return Execute(proceed, (next, behavior) => () => behavior.InvokeMember(next, self, name, args));
  28. }
  29. public object GetIndex(Func<object> proceed, object self, IEnumerable<string> keys)
  30. {
  31. return Execute(proceed, (next, behavior) => () => behavior.GetIndex(next, self, keys));
  32. }
  33. public object SetIndex(Func<object> proceed, object self, IEnumerable<string> keys, object value)
  34. {
  35. return Execute(proceed, (next, behavior) => () => behavior.SetIndex(next, self, keys, value));
  36. }
  37. public object Convert(Func<object> proceed, object self, Type type, bool isExplicit)
  38. {
  39. return Execute(proceed, (next, behavior) => () => behavior.Convert(next, self, type, isExplicit));
  40. }
  41. public object BinaryOperation(Func<object> proceed, object self, ExpressionType operation, object value)
  42. {
  43. return Execute(proceed, (next, behavior) => () => behavior.BinaryOperation(next, self, operation, value));
  44. }
  45. public object InvokeMemberMissing(Func<object> proceed, object self, string name, INamedEnumerable<object> args)
  46. {
  47. return Execute(proceed, (next, behavior) => () => behavior.InvokeMemberMissing(next, self, name, args));
  48. }
  49. public object GetMemberMissing(Func<object> proceed, object self, string name)
  50. {
  51. return Execute(proceed, (next, behavior) => () => behavior.GetMemberMissing(next, self, name));
  52. }
  53. public object SetMemberMissing(Func<object> proceed, object self, string name, object value)
  54. {
  55. return Execute(proceed, (next, behavior) => () => behavior.SetMemberMissing(next, self, name, value));
  56. }
  57. public object ConvertMissing(Func<object> proceed, object self, Type type, bool isExplicit)
  58. {
  59. return Execute(proceed, (next, behavior) => () => behavior.ConvertMissing(next, self, type, isExplicit));
  60. }
  61. }