using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; namespace Masuit.Tools.Dynamics; internal class ClayBehaviorCollection(IEnumerable behaviors) : List(behaviors), IClayBehavior { private object Execute(Func proceed, Func, IClayBehavior, Func> linker) { return this.Aggregate(proceed, linker)(); } /// public object GetMember(Func proceed, object self, string name) { return Execute(proceed, (next, behavior) => () => behavior.GetMember(next, self, name)); } public object SetMember(Func proceed, object self, string name, object value) { return Execute(proceed, (next, behavior) => () => behavior.SetMember(next, self, name, value)); } public object GetMembers(Func proceed, object self, IDictionary members) { return Execute(proceed, (next, behavior) => () => behavior.GetMembers(next, self, members)); } public object InvokeMember(Func proceed, object self, string name, INamedEnumerable args) { return Execute(proceed, (next, behavior) => () => behavior.InvokeMember(next, self, name, args)); } public object GetIndex(Func proceed, object self, IEnumerable keys) { return Execute(proceed, (next, behavior) => () => behavior.GetIndex(next, self, keys)); } public object SetIndex(Func proceed, object self, IEnumerable keys, object value) { return Execute(proceed, (next, behavior) => () => behavior.SetIndex(next, self, keys, value)); } public object Convert(Func proceed, object self, Type type, bool isExplicit) { return Execute(proceed, (next, behavior) => () => behavior.Convert(next, self, type, isExplicit)); } public object BinaryOperation(Func proceed, object self, ExpressionType operation, object value) { return Execute(proceed, (next, behavior) => () => behavior.BinaryOperation(next, self, operation, value)); } public object InvokeMemberMissing(Func proceed, object self, string name, INamedEnumerable args) { return Execute(proceed, (next, behavior) => () => behavior.InvokeMemberMissing(next, self, name, args)); } public object GetMemberMissing(Func proceed, object self, string name) { return Execute(proceed, (next, behavior) => () => behavior.GetMemberMissing(next, self, name)); } public object SetMemberMissing(Func proceed, object self, string name, object value) { return Execute(proceed, (next, behavior) => () => behavior.SetMemberMissing(next, self, name, value)); } public object ConvertMissing(Func proceed, object self, Type type, bool isExplicit) { return Execute(proceed, (next, behavior) => () => behavior.ConvertMissing(next, self, type, isExplicit)); } }