public CommandObjectIOMethod(ConstructorInfo c, string recordName, bool isRootElement) { m_isRootElement = isRootElement; m_recordName = recordName; var type = typeof(T); m_constructor = c.Compile <T>(); var records = new List <FieldIO>(); HashSet <string> ids = new HashSet <string>(); foreach (var member in type.GetMembers(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)) { AddIfValid(ids, records, member); if (member is MethodInfo method) { object[] attributes = member.GetCustomAttributes(true); foreach (var attribute in attributes.OfType <CommandEventAttribute>()) { switch (attribute.Events) { case CommandEvents.BeforeLoad: TryAdd(method, ref BeforeLoad); break; case CommandEvents.AfterLoad: TryAdd(method, ref AfterLoad); break; case CommandEvents.BeforeSave: TryAdd(method, ref BeforeSave); break; case CommandEvents.AfterSave: TryAdd(method, ref AfterSave); break; case CommandEvents.MissingValue: TryAdd(method, ref MissingValue); break; case CommandEvents.MissingElement: TryAdd(method, ref MissingElement); break; default: throw new ArgumentOutOfRangeException(); } } } } m_records = records.ToArray(); }