private static Func <IDataContext, object> ConvertParameterInternal(IBuilderSyntax builder, ParameterCacheValue value) { var actions = value.Actions; for (int i = 0; i < actions.Length; i++) { actions[i].Invoke((IBindingToSyntax)builder); } var func = value.Expression; var members = value.Members; var sources = new IObserver[members.Length]; for (int i = 0; i < members.Length; i++) { sources[i] = members[i].Invoke(builder.Builder); } return(dataContext => { var objects = new object[sources.Length + 1]; objects[0] = dataContext; for (int i = 0; i < sources.Length; i++) { objects[i + 1] = sources[i].GetCurrentValue(); } return func(dataContext, objects); }); }
private static IBindingInfoBehaviorSyntax WithBehaviorInternal(this IBuilderSyntax syntax, IBindingBehavior behavior) { Should.NotBeNull(syntax, "syntax"); Should.NotBeNull(behavior, "behavior"); IList <IBindingBehavior> behaviors = syntax.Builder.GetOrAddBehaviors(); behaviors.Add(behavior); return(syntax.Builder.GetOrAddSyntaxBuilder()); }
private static TResult GetOrAddSyntaxBuilder<TResult, T1, T2>(this IBuilderSyntax bindingSyntax) where T1 : class where TResult : IBindingInfoSyntax<T2> { if (bindingSyntax is TResult) return (TResult)bindingSyntax; IBindingBuilder builder = bindingSyntax.Builder; object syntaxBuilder; if (!builder.TryGetData(SyntaxBuilderConstant, out syntaxBuilder) || !(syntaxBuilder is TResult)) { syntaxBuilder = new SyntaxBuilder<T1, T2>(builder); builder.AddOrUpdate(SyntaxBuilderConstant, syntaxBuilder); } return (TResult)syntaxBuilder; }
private static IBindingInfoBehaviorSyntax <TSource> WithParameter <TSource, TValue>(this IBuilderSyntax syntax, DataConstant <Func <IDataContext, TValue> > constant, Func <LambdaExpression> expression) { Should.NotBeNull(syntax, "syntax"); Func <IDataContext, TValue> value; if (typeof(TValue) == typeof(object)) { value = (Func <IDataContext, TValue>)(object) LambdaExpressionToBindingExpressionConverter.ConvertParameter(expression, syntax); } else { value = LambdaExpressionToBindingExpressionConverter.ConvertParameter(expression, syntax).CastFunc <TValue>; } syntax.Builder.AddOrUpdate(constant, value); return(syntax.GetOrAddSyntaxBuilder <IBindingInfoBehaviorSyntax <TSource>, object, TSource>()); }
private static IBindingInfoBehaviorSyntax <TSource> WithBehaviorInternal <TSource>(this IBuilderSyntax syntax, IBindingBehavior behavior) { Should.NotBeNull(syntax, "syntax"); Should.NotBeNull(behavior, "behavior"); syntax.Builder.GetOrAddBehaviors().Add(behavior); return(syntax.GetOrAddSyntaxBuilder <IBindingInfoBehaviorSyntax <TSource>, object, TSource>()); }
private static IBindingInfoBehaviorSyntax<TSource> WithParameter<TSource, TValue>(this IBuilderSyntax syntax, DataConstant<Func<IDataContext, TValue>> constant, Func<LambdaExpression> expression) { Should.NotBeNull(syntax, nameof(syntax)); BindingServiceProvider.BindingProvider.BuildParameterFromLambdaExpression(syntax.Builder, expression, constant); return syntax.GetOrAddSyntaxBuilder<IBindingInfoBehaviorSyntax<TSource>, object, TSource>(); }
public static Func <IDataContext, object> ConvertParameter(Func <LambdaExpression> expression, IBuilderSyntax syntax) { Should.NotBeNull(expression, "expression"); var hasClosure = expression.HasClosure(); if (hasClosure || syntax.Builder.Contains(BindingBuilderConstants.NoCache)) { var e = expression(); if (hasClosure) { e.TraceClosureWarn(); } var converter = new LambdaExpressionToBindingExpressionConverter(e); return(ConvertParameterInternal(syntax, converter.ConvertParamterInternal(e))); } ParameterCacheValue value; lock (CacheParameter) { if (!CacheParameter.TryGetValue(expression, out value)) { var e = expression(); var converter = new LambdaExpressionToBindingExpressionConverter(e); value = converter.ConvertParamterInternal(e); CacheParameter[expression] = value; } } return(ConvertParameterInternal(syntax, value)); }