Exemple #1
0
        public ExprDotNodeForgeStaticMethod(
            ExprNode parent,
            bool isReturnsConstantResult,
            string classOrPropertyName,
            MethodInfo staticMethod,
            ExprForge[] childForges,
            bool isConstantParameters,
            ExprDotForge[] chainForges,
            ExprDotStaticMethodWrap resultWrapLambda,
            bool rethrowExceptions,
            ValueAndFieldDesc targetObject,
            string optionalStatementName,
            bool isLocalInlinedClass)
        {
            ExprForgeRenderable = parent;
            IsReturnsConstantResult = isReturnsConstantResult;
            ClassOrPropertyName = classOrPropertyName;
            StaticMethod = staticMethod;
            ChildForges = childForges;
            IsConstantParameters = chainForges.Length <= 0 && isConstantParameters;

            ChainForges = chainForges;
            ResultWrapLambda = resultWrapLambda;
            IsRethrowExceptions = rethrowExceptions;
            TargetObject = targetObject;
            OptionalStatementName = optionalStatementName;
            IsLocalInlinedClass = isLocalInlinedClass;
        }
Exemple #2
0
        public static CodegenExpression CodegenInvokeExpression(
            ValueAndFieldDesc optionalTargetObject,
            MethodInfo reflectionMethod,
            StaticMethodCodegenArgDesc[] args,
            CodegenClassScope codegenClassScope)
        {
            var parameters = reflectionMethod.GetParameters();
            var expressions = new CodegenExpression[args.Length];
            for (var i = 0; i < expressions.Length; i++) {
                // Check for downcast transformations between nullables and non-nullables
                var parameter = parameters[i];
                if (parameter.ParameterType == args[i].DeclareType) {
                    expressions[i] = Ref(args[i].BlockRefName);
                }
                else if (parameter.ParameterType.CanNotBeNull() && args[i].DeclareType.IsNullable()) {
                    expressions[i] = ExprDotName(Ref(args[i].BlockRefName), "Value");
                }
                else {
                    expressions[i] = Ref(args[i].BlockRefName);
                }
            }

            if (optionalTargetObject == null) {
                return StaticMethod(reflectionMethod.DeclaringType, reflectionMethod.Name, expressions);
            }

            if (optionalTargetObject.Value != null && optionalTargetObject.Value.GetType().IsEnum) {
                return ExprDotMethod(
                    EnumValue(optionalTargetObject.Value.GetType(), optionalTargetObject.Value.ToString()),
                    reflectionMethod.Name,
                    expressions);
            }

            return ExprDotMethod(
                PublicConstValue(optionalTargetObject.Field.DeclaringType, optionalTargetObject.Field.Name),
                reflectionMethod.Name,
                expressions);
        }