示例#1
0
        public static Func <IDataContext, object> ConvertParameter(IBindingBuilder builder, Func <LambdaExpression> expression)
        {
            var hasClosure = expression.HasClosure();

            if (hasClosure || builder.Contains(BindingBuilderConstants.NoCache))
            {
                var e = expression();
                if (hasClosure)
                {
                    e.TraceClosureWarn();
                }
                var converter = new LambdaExpressionToBindingExpressionConverter(e);
                return(ConvertParameterInternal(builder, 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(builder, value));
        }
示例#2
0
        public static void Convert(IBindingBuilder builder, Func <LambdaExpression> expression)
        {
            var hasClosure = expression.HasClosure();

            if (hasClosure || builder.Contains(BindingBuilderConstants.NoCache))
            {
                var ex = expression();
                if (hasClosure)
                {
                    ex.TraceClosureWarn();
                }
                Convert(builder, ex);
                return;
            }
            Action <IBindingBuilder>[] callbacks;
            lock (Cache)
            {
                if (!Cache.TryGetValue(expression, out callbacks))
                {
                    callbacks         = ConvertInternal(expression(), builder, false);
                    Cache[expression] = callbacks;
                }
            }
            for (int i = 0; i < callbacks.Length; i++)
            {
                callbacks[i].Invoke(builder);
            }
        }