Beispiel #1
0
        private Expression <ReadDelegate <T> > GetLambdaExpression <T>()
        {
            var brParameter = Expression.Parameter(typeof(BitsReader), "br");

            Dictionary <Type, Expression <ReadFunc> > typeReaders = Types.ToDictionary(pair => pair.Key, pair =>
            {
                var args         = new ExpressionBuilderArgs();
                args.BrParameter = brParameter;
                args.InstanceVar = Expression.Parameter(typeof(Object));
                args.TypeReaders = Expression.Parameter(typeof(Dictionary <Type, Expression <ReadFunc> >));
                args.Endianness  = Expression.Constant(_endianness);
                var expression   = pair.Value.BuildExpression(args);
                return(Expression.Lambda <ReadFunc>(expression, string.Format("Read_{0}", pair.Key.Name),
                                                    new[] { args.BrParameter, args.InstanceVar, args.TypeReaders }));
            });

            var resultVar         = Expression.Variable(typeof(T), "root");
            var brCheckExpression = Expression.IfThen(Expression.Equal(brParameter, Expression.Constant(null)),
                                                      Expression.Throw(Expression.New(typeof(ArgumentNullException).GetConstructor(new[] { typeof(String) }), Expression.Constant(brParameter.Name, typeof(String)))));
            var ctorExpression     = Expression.Assign(resultVar, Expression.New(typeof(T)));
            var typeReadersVar     = Expression.Variable(typeof(Dictionary <Type, Expression <ReadFunc> >));
            var typeReadExpression = Expression.Block(new[] { resultVar, typeReadersVar },
                                                      brCheckExpression,
                                                      CreateTypeReaders(typeReadersVar, typeReaders),
                                                      ctorExpression,
                                                      Expression.Invoke(AdvancedExpression.GetTypeBuilder(typeReadersVar, Expression.Constant(typeof(T))),
                                                                        brParameter, resultVar, typeReadersVar),
                                                      resultVar);

            return(Expression.Lambda <ReadDelegate <T> >(typeReadExpression, string.Format("Read_Root", typeof(T).Name), new[] { brParameter }));
        }
 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)));
 }