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; }
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); }