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))); }