ClayBehaviorCollection.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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 : List<IClayBehavior>, IClayBehavior
  7. {
  8. public ClayBehaviorCollection(IEnumerable<IClayBehavior> behaviors)
  9. : base(behaviors)
  10. {
  11. }
  12. private object Execute(Func<object> proceed, Func<Func<object>, IClayBehavior, Func<object>> linker)
  13. {
  14. return this.Aggregate(proceed, linker)();
  15. }
  16. /// <inheritdoc />
  17. public object GetMember(Func<object> proceed, object self, string name)
  18. {
  19. return Execute(proceed, (next, behavior) => () => behavior.GetMember(next, self, name));
  20. }
  21. public object SetMember(Func<object> proceed, object self, string name, object value)
  22. {
  23. return Execute(proceed, (next, behavior) => () => behavior.SetMember(next, self, name, value));
  24. }
  25. public object GetMembers(Func<object> proceed, object self, IDictionary<string, object> members)
  26. {
  27. return Execute(proceed, (next, behavior) => () => behavior.GetMembers(next, self, members));
  28. }
  29. public object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args)
  30. {
  31. return Execute(proceed, (next, behavior) => () => behavior.InvokeMember(next, self, name, args));
  32. }
  33. public object GetIndex(Func<object> proceed, object self, IEnumerable<string> keys)
  34. {
  35. return Execute(proceed, (next, behavior) => () => behavior.GetIndex(next, self, keys));
  36. }
  37. public object SetIndex(Func<object> proceed, object self, IEnumerable<string> keys, object value)
  38. {
  39. return Execute(proceed, (next, behavior) => () => behavior.SetIndex(next, self, keys, value));
  40. }
  41. public object Convert(Func<object> proceed, object self, Type type, bool isExplicit)
  42. {
  43. return Execute(proceed, (next, behavior) => () => behavior.Convert(next, self, type, isExplicit));
  44. }
  45. public object BinaryOperation(Func<object> proceed, object self, ExpressionType operation, object value)
  46. {
  47. return Execute(proceed, (next, behavior) => () => behavior.BinaryOperation(next, self, operation, value));
  48. }
  49. public object InvokeMemberMissing(Func<object> proceed, object self, string name, INamedEnumerable<object> args)
  50. {
  51. return Execute(proceed, (next, behavior) => () => behavior.InvokeMemberMissing(next, self, name, args));
  52. }
  53. public object GetMemberMissing(Func<object> proceed, object self, string name)
  54. {
  55. return Execute(proceed, (next, behavior) => () => behavior.GetMemberMissing(next, self, name));
  56. }
  57. public object SetMemberMissing(Func<object> proceed, object self, string name, object value)
  58. {
  59. return Execute(proceed, (next, behavior) => () => behavior.SetMemberMissing(next, self, name, value));
  60. }
  61. public object ConvertMissing(Func<object> proceed, object self, Type type, bool isExplicit)
  62. {
  63. return Execute(proceed, (next, behavior) => () => behavior.ConvertMissing(next, self, type, isExplicit));
  64. }
  65. }