public static IReadOnlyDictionary <AccessorMember, object> ToHash(this AccessorMembers members, object @object, string[] fields, IDataInfoProvider provider, IEnumerable <IFieldTransform> transforms) { var accessor = ReadAccessor.Create(@object, members.Types, members.Scope); var usePool = fields.Length > 0 || provider != null; // FIXME: remove AsList call var include = usePool ? Pooling.ListPool <AccessorMember> .Get() : members.AsList(); try { if (fields.Length > 0) { foreach (var field in fields) { if (members.TryGetValue(field, out var member) && !IsIgnored(provider, member) && IsSaved(provider, member)) { include.Add(member); } } } else { foreach (var member in members) { if (IsIgnored(provider, member)) { include.Remove(member); continue; } if (IsSaved(provider, member)) { include.Add(member); } } } return(members.ToDictionary(k => k, v => ResolveValue(@object, transforms, accessor, v))); } finally { if (usePool) { Pooling.ListPool <AccessorMember> .Return((List <AccessorMember>) include); } } }