Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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();
        }