static PipelineBinder() { __methodCallBinder = new MethodInfoMethodCallBinder <PipelineBindingContext>(); __methodCallBinder.Register(new AnyBinder(), AnyBinder.GetSupportedMethods()); __methodCallBinder.Register(new AverageBinder(), AverageBinder.GetSupportedMethods()); __methodCallBinder.Register(new CountBinder(), CountBinder.GetSupportedMethods()); __methodCallBinder.Register(new DistinctBinder(), DistinctBinder.GetSupportedMethods()); __methodCallBinder.Register(new FirstBinder(), FirstBinder.GetSupportedMethods()); __methodCallBinder.Register(new GroupByBinder(), GroupByBinder.GetSupportedMethods()); __methodCallBinder.Register(new GroupByWithResultSelectorBinder(), GroupByWithResultSelectorBinder.GetSupportedMethods()); __methodCallBinder.Register(new JoinBinder(), JoinBinder.GetSupportedMethods()); __methodCallBinder.Register(new MaxBinder(), MaxBinder.GetSupportedMethods()); __methodCallBinder.Register(new MinBinder(), MinBinder.GetSupportedMethods()); __methodCallBinder.Register(new OfTypeBinder(), OfTypeBinder.GetSupportedMethods()); __methodCallBinder.Register(new OrderByBinder(), OrderByBinder.GetSupportedMethods()); __methodCallBinder.Register(new SampleBinder(), SampleBinder.GetSupportedMethods()); __methodCallBinder.Register(new SelectBinder(), SelectBinder.GetSupportedMethods()); __methodCallBinder.Register(new SelectManyBinder(), SelectManyBinder.GetSupportedMethods()); __methodCallBinder.Register(new SingleBinder(), SingleBinder.GetSupportedMethods()); __methodCallBinder.Register(new SkipBinder(), SkipBinder.GetSupportedMethods()); __methodCallBinder.Register(new StandardDeviationPopulationBinder(), StandardDeviationPopulationBinder.GetSupportedMethods()); __methodCallBinder.Register(new StandardDeviationSampleBinder(), StandardDeviationSampleBinder.GetSupportedMethods()); __methodCallBinder.Register(new SumBinder(), SumBinder.GetSupportedMethods()); __methodCallBinder.Register(new TakeBinder(), TakeBinder.GetSupportedMethods()); __methodCallBinder.Register(new ThenByBinder(), ThenByBinder.GetSupportedMethods()); __methodCallBinder.Register(new WhereBinder(), WhereBinder.GetSupportedMethods()); }
public static Expression Unpack(IDictionary <string, object> packedExpression, ITypeResolver typeResolver = null, Expression global = null, Type expectedType = null) { if (packedExpression == null) { throw new ArgumentNullException("packedExpression"); } if (typeResolver == null) { typeResolver = KnownTypeResolver.Default; } if (expectedType == null) { expectedType = typeof(object); } var syntaxTree = new SyntaxTreeNode(packedExpression); var bindingContext = new BindingContext(typeResolver, Constants.EmptyReadonlyParameters, expectedType, global); var boundExpression = default(Expression); var bindingError = default(Exception); if (AnyBinder.TryBindInNewScope(syntaxTree, bindingContext, TypeDescription.GetTypeDescription(expectedType), out boundExpression, out bindingError) == false) { throw bindingError; } return(boundExpression); }
static EmbeddedPipelineBinder() { var infoBinder = new MethodInfoMethodCallBinder <EmbeddedPipelineBindingContext>(); infoBinder.Register(new AllBinder(), AllBinder.GetSupportedMethods()); infoBinder.Register(new AnyBinder(), AnyBinder.GetSupportedMethods()); infoBinder.Register(new AverageBinder(), AverageBinder.GetSupportedMethods()); infoBinder.Register(new DistinctBinder(), DistinctBinder.GetSupportedMethods()); infoBinder.Register(new ExceptBinder(), ExceptBinder.GetSupportedMethods()); infoBinder.Register(new FirstBinder(), FirstBinder.GetSupportedMethods()); infoBinder.Register(new IntersectBinder(), IntersectBinder.GetSupportedMethods()); infoBinder.Register(new LastBinder(), LastBinder.GetSupportedMethods()); infoBinder.Register(new MaxBinder(), MaxBinder.GetSupportedMethods()); infoBinder.Register(new MinBinder(), MinBinder.GetSupportedMethods()); infoBinder.Register(new SelectBinder(), SelectBinder.GetSupportedMethods()); infoBinder.Register(new SumBinder(), SumBinder.GetSupportedMethods()); infoBinder.Register(new ToArrayBinder(), ToArrayBinder.GetSupportedMethods()); infoBinder.Register(new ToHashSetBinder(), ToHashSetBinder.GetSupportedMethods()); infoBinder.Register(new ToListBinder(), ToListBinder.GetSupportedMethods()); infoBinder.Register(new UnionBinder(), UnionBinder.GetSupportedMethods()); infoBinder.Register(new WhereBinder(), WhereBinder.GetSupportedMethods()); var nameBinder = new NameBasedMethodCallBinder <EmbeddedPipelineBindingContext>(); nameBinder.Register(new ContainsBinder(), ContainsBinder.IsSupported, ContainsBinder.SupportedMethodNames); nameBinder.Register(new CountBinder(), CountBinder.IsSupported, CountBinder.SupportedMethodNames); __methodCallBinder = new CompositeMethodCallBinder <EmbeddedPipelineBindingContext>( infoBinder, nameBinder); }
/// <summary> /// Binds specified syntax tree to concrete types and optional context. /// </summary> /// <param name="node">Syntax tree. Not null.</param> /// <param name="global">Context expression. Can be null. Usually <see cref="Expression.Constant(object)"/>.</param> /// <returns></returns> public LambdaExpression Bind(SyntaxTreeNode node, Expression global = null) { if (node == null) { throw new ArgumentNullException("node"); } var bindingContext = default(BindingContext); // lambda binding substitution feature if (node.GetExpressionType(throwOnError: true) == Constants.EXPRESSION_TYPE_LAMBDA && this.resultType.IsDelegate == false) { var newParameterNames = LambdaBinder.ExtractArgumentNames(node); if (newParameterNames.Length != this.parameters.Count) { throw new ExpressionParserException(Resources.EXCEPTION_BIND_UNABLEREMAPPARAMETERSCOUNTMISMATCH, node); } var newParameters = new ParameterExpression[newParameterNames.Length]; for (var i = 0; i < newParameters.Length; i++) { newParameters[i] = Expression.Parameter(this.parameters[i].Type, newParameterNames[i]); } bindingContext = new BindingContext(this.typeResolver, new ReadOnlyCollection <ParameterExpression>(newParameters), this.resultType, global); node = node.GetExpression(throwOnError: true); } else { bindingContext = new BindingContext(this.typeResolver, this.parameters, this.resultType, global); } var body = default(Expression); var bindingError = default(Exception); if (AnyBinder.TryBind(node, bindingContext, this.resultType, out body, out bindingError) == false) { throw bindingError; } Debug.Assert(body != null, "body != null"); bindingContext.CompleteNullPropagation(ref body); if (body.Type != this.resultType && this.resultType.IsVoid == false) { try { body = Expression.ConvertChecked(body, this.resultType); } catch (InvalidOperationException) { throw new InvalidOperationException(string.Format(Resources.EXCEPTION_BIND_INVALIDLAMBDABODYTYPE, body.Type, this.resultType)); } } return(Expression.Lambda(this.lambdaType, body, bindingContext.Parameters)); }
static EmbeddedPipelineBinder() { var infoBinder = new MethodInfoMethodCallBinder <EmbeddedPipelineBindingContext>(); infoBinder.Register(new AggregateBinder(), AggregateBinder.GetSupportedMethods()); infoBinder.Register(new AllBinder(), AllBinder.GetSupportedMethods()); infoBinder.Register(new AnyBinder(), AnyBinder.GetSupportedMethods()); infoBinder.Register(new AsQueryableBinder(), AsQueryableBinder.GetSupportedMethods()); infoBinder.Register(new AverageBinder(), AverageBinder.GetSupportedMethods()); infoBinder.Register(new ConcatBinder(), ConcatBinder.GetSupportedMethods()); infoBinder.Register(new DefaultIfEmptyBinder(), DefaultIfEmptyBinder.GetSupportedMethods()); infoBinder.Register(new DistinctBinder(), DistinctBinder.GetSupportedMethods()); infoBinder.Register(new ExceptBinder(), ExceptBinder.GetSupportedMethods()); infoBinder.Register(new FirstBinder(), FirstBinder.GetSupportedMethods()); infoBinder.Register(new IntersectBinder(), IntersectBinder.GetSupportedMethods()); infoBinder.Register(new LastBinder(), LastBinder.GetSupportedMethods()); infoBinder.Register(new MaxBinder(), MaxBinder.GetSupportedMethods()); infoBinder.Register(new MinBinder(), MinBinder.GetSupportedMethods()); infoBinder.Register(new OfTypeBinder(), OfTypeBinder.GetSupportedMethods()); infoBinder.Register(new ReverseBinder(), ReverseBinder.GetSupportedMethods()); infoBinder.Register(new SelectBinder(), SelectBinder.GetSupportedMethods()); infoBinder.Register(new SkipBinder(), SkipBinder.GetSupportedMethods()); infoBinder.Register(new StandardDeviationBinder(), StandardDeviationBinder.GetSupportedMethods()); infoBinder.Register(new SumBinder(), SumBinder.GetSupportedMethods()); infoBinder.Register(new TakeBinder(), TakeBinder.GetSupportedMethods()); infoBinder.Register(new ToArrayBinder(), ToArrayBinder.GetSupportedMethods()); infoBinder.Register(new ToHashSetBinder(), ToHashSetBinder.GetSupportedMethods()); infoBinder.Register(new ToListBinder(), ToListBinder.GetSupportedMethods()); infoBinder.Register(new UnionBinder(), UnionBinder.GetSupportedMethods()); infoBinder.Register(new WhereBinder(), WhereBinder.GetSupportedMethods()); infoBinder.Register(new ZipBinder(), ZipBinder.GetSupportedMethods()); var nameBinder = new NameBasedMethodCallBinder <EmbeddedPipelineBindingContext>(); nameBinder.Register(new ContainsBinder(), ContainsBinder.IsSupported, ContainsBinder.SupportedMethodNames); nameBinder.Register(new CountBinder(), CountBinder.IsSupported, CountBinder.SupportedMethodNames); __methodCallBinder = new CompositeMethodCallBinder <EmbeddedPipelineBindingContext>( infoBinder, nameBinder); }