protected override Expression BuildCtorExpression(ExpressionBuilderArgs args) { var elementType = MemberType.GetElementType(); var lengthVar = Expression.Variable(typeof(UInt64), "length"); var ctorExp = Expression.NewArrayBounds( elementType, lengthVar); return(Expression.Block(new [] { lengthVar }, Expression.Assign(lengthVar, Invoke(_length, args)), AdvancedExpression.Debug(string.Format("Array {0} initialized. ({{0}} elements).", MemberName), lengthVar), ctorExp)); }
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))); }
protected override Expression BuildBodyExpression(ExpressionBuilderArgs args, ParameterExpression innerResultVar, ParameterExpression typeVar) { return(Expression.Block(AdvancedExpression.Debug("Type: {0}", typeVar), Expression.Invoke(AdvancedExpression.GetTypeBuilder(args.TypeReaders, typeVar), args.BrParameter, innerResultVar, args.TypeReaders))); }