示例#1
0
        private SortedList <Int32, MemberBuilder <T> > GetMembers()
        {
            var result = new SortedList <Int32, MemberBuilder <T> >();
            var order  = 0;

            foreach (var memberInfo in typeof(T).GetMembers().Where(ShouldReadMember))
            {
                MemberBuilder <T> builder;
                if (!_memberBuilders.ContainsKey(memberInfo))
                {
                    if (memberInfo.IsArray())
                    {
                        throw new InvalidMappingException(string.Format("Array member '{0}' can't be configured automatically.", memberInfo));
                    }
                    // TODO: add check for default ctor existance
                    builder = MemberBuilder <T> .Create(memberInfo);
                }
                else
                {
                    builder = _memberBuilders[memberInfo];
                }
                if (builder != null)
                {
                    result.Add(builder.Order != 0 ? builder.Order : order, builder);
                    order++;
                }
            }
            return(result);
        }
        protected override Expression BuildBodyExpression(ExpressionBuilderArgs args, ParameterExpression innerResultVar, ParameterExpression typeVar)
        {
            var elementType = typeof(TElement);
            //IExpressionBuilder typeBuilder = FileFormatBuilder.Types[elementType];
            var iVar           = Expression.Variable(typeof(int), "i");
            var elementVar     = Expression.Variable(elementType, "iterator");
            var loopEndLabel   = Expression.Label();
            var elementBuilder = MemberBuilder <TMember, TElement> .Create("[i]");

            if (_elementBuilderConfiguration != null)
            {
                _elementBuilderConfiguration(elementBuilder);
            }
            var innerArgs = args.Clone();

            innerArgs.InstanceVar = innerResultVar;
            return(Expression.Block(
                       new[] { iVar, elementVar },
                       Expression.Assign(iVar, Expression.Constant(0)),
                       AdvancedExpression.Debug("Reading collection {0}...", Expression.Constant(MemberName)),
                       Expression.Loop(
                           Expression.IfThenElse(
                               GetLoopCondition(args, innerResultVar, iVar, elementVar),
                               Expression.Block(
                                   AdvancedExpression.Debug("Reading {0}[{1}]...", Expression.Constant(MemberName), iVar),
                                   Expression.Assign(elementVar, elementBuilder.BuildExpression(innerArgs)),

/*
 *                          Expression.Assign(elementVar, elementCtor),
 *                          typeBuilder.BuildExpression(brParameter, elementVar, typeReaders),
 */
                                   InsertElement(args, innerResultVar, iVar, elementVar),
                                   Expression.PostIncrementAssign(iVar)),
                               Expression.Break(loopEndLabel)),
                           loopEndLabel)));
        }