Beispiel #1
0
        public ProcessingResult ProcessExpression(Expression expression, List <NodeReference> references, DataContext context)
        {
            var invocationExpression = expression as InvocationExpression;

            if (invocationExpression == null)
            {
                return(ProcessingResult.Unsuccessful);
            }

            var argumentsResults = CallProcessingHelper.ProcessArguments(invocationExpression.Arguments, references, context);

            if (!argumentsResults.All(r => r.IsSuccess))
            {
                return(ProcessingResult.Unsuccessful);
            }

            var delegateResult = ExpressionProcessingHelper.ProcessExpression(invocationExpression.Expression, references, context);

            if (!delegateResult.IsSuccess)
            {
                return(ProcessingResult.Unsuccessful);
            }

            return(CallProcessingHelper.ProcessCall(argumentsResults, delegateResult, (del, arguments) =>
            {
                var delegateInstance = del as Delegate;
                return delegateInstance != null
                    ? new ProcessingResult(true, delegateInstance.DynamicInvoke(arguments))
                    : ProcessingResult.Unsuccessful;
            }));
        }
        public ProcessingResult ProcessExpression(Expression expression, List <NodeReference> references, DataContext context)
        {
            var newExpression = expression as NewExpression;

            if (newExpression == null)
            {
                return(ProcessingResult.Unsuccessful);
            }

            var argumentsResult = CallProcessingHelper.ProcessArguments(newExpression.Arguments, references, context);

            if (!argumentsResult.All(a => a.IsSuccess))
            {
                return(ProcessingResult.Unsuccessful);
            }

            var constructorResult = new ProcessingResult(true, newExpression.Constructor, true);

            return(CallProcessingHelper.ProcessCall(argumentsResult, constructorResult, (constructor, arguments) =>
            {
                var constructorInfo = constructor as ConstructorInfo;
                return constructorInfo != null
                    ? new ProcessingResult(true, constructorInfo.Invoke(arguments))
                    : new ProcessingResult(true, Activator.CreateInstance(expression.Type));
            }));
        }
        public ProcessingResult ProcessExpression(Expression expression, List <NodeReference> references, DataContext context)
        {
            var callExpression = expression as MethodCallExpression;

            if (callExpression == null)
            {
                return(ProcessingResult.Unsuccessful);
            }

            var processedArguments = CallProcessingHelper.ProcessArguments(callExpression.Arguments, references, context);

            if (processedArguments.Any(a => !a.IsSuccess))
            {
                return(ProcessingResult.Unsuccessful);
            }

            var processedObject = ProcessObjectExpression(callExpression.Object, references, context);

            if (!processedObject.IsSuccess)
            {
                return(ProcessingResult.Unsuccessful);
            }

            return(CallProcessingHelper.ProcessCall(processedArguments, processedObject,
                                                    (obj, arguments) => new ProcessingResult(true, callExpression.Method.Invoke(obj, arguments))));
        }
        private static ProcessingResult ProcessNewArrayInitExpression(NewArrayExpression expression, List <NodeReference> references, DataContext context)
        {
            var items = CallProcessingHelper.ProcessArguments(expression.Expressions, references, context);

            if (!items.All(i => i.IsSuccess))
            {
                return(ProcessingResult.Unsuccessful);
            }

            var arrayElementType  = expression.Type.GetElementType();
            var elementTypeResult = new ProcessingResult(true, arrayElementType, true);

            return(CallProcessingHelper.ProcessCall(items, elementTypeResult, ArrayInitResolver));
        }
        private static ProcessingResult ProcessNewArrayBoundsExpression(NewArrayExpression expression, List <NodeReference> references, DataContext context)
        {
            var dimensionsLengths = CallProcessingHelper.ProcessArguments(expression.Expressions, references, context);

            if (!dimensionsLengths.All(d => d.IsSuccess))
            {
                return(ProcessingResult.Unsuccessful);
            }

            var arrayElementType  = expression.Type.GetElementType();
            var elementTypeResult = new ProcessingResult(true, arrayElementType, true);

            return(CallProcessingHelper.ProcessCall(dimensionsLengths, elementTypeResult, (elementType, lengths) =>
            {
                var type = elementType as Type;
                var dimensions = lengths.Cast <int>().ToArray();
                return type != null
                    ? new ProcessingResult(true, Array.CreateInstance(type, dimensions), true)
                    : ProcessingResult.Unsuccessful;
            }));
        }