private Action <TSource, object[], object> ForProperty(MemberInfo lastMember) { var parSource = Expression.Parameter(typeof(TSource)); var getBase = GetFunctionBuilder <TSource> .GetFunction(m_pathItems.Take(m_pathItems.Count - 1).ToList()); if (lastMember is FieldInfo) { var fieldLastMember = (FieldInfo)lastMember; return((source, indexes, value) => fieldLastMember.SetValue(getBase(source, indexes), value)); } var propLastMember = (PropertyInfo)lastMember; if (propLastMember != null && propLastMember.CanWrite) { return((source, indexes, value) => propLastMember.SetValue(getBase(source, indexes), value)); } if (propLastMember != null && !propLastMember.CanWrite) { var backFieldName = $"<{propLastMember.Name}>i__Field"; var backField = propLastMember .DeclaringType .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) .FirstOrDefault(f => f.Name == backFieldName); return((source, indexes, value) => backField.SetValue(getBase(source, indexes), value)); } return(null); }
public void PrepareForIndexing() { m_indexCount = m_items.Where(x => x.Array != null).Count(); m_get = GetFunctionBuilder <TSource> .GetFunction(m_items); m_set = new SetFunctionBuilder <TSource>(m_items).Build(); m_available = new ExistFunctionBuilder <TSource>(m_items).Build(); m_indexes = new IndexesFunctionBuilder <TSource>(m_items).Build(); }