Esempio n. 1
0
        /// <summary>
        /// Generates a wrapper method that takes arguments of the original method.
        /// </summary>
        protected virtual CodeTypeMember GetBasicReferenceMethod(MethodInfo methodInfo, CodeTypeParameterCollection genericTypeParam, bool isObserver)
        {
            SerializerGenerationManager.RecordTypeToGenerate(methodInfo.ReturnType);
            foreach (var paramInfo in methodInfo.GetParameters())
            {
                SerializerGenerationManager.RecordTypeToGenerate(paramInfo.ParameterType);
            }

            CodeTypeReference returnType;

            if (!isObserver)
            {
                // Method is expected to return either a Task or a grain reference
                if (!GrainInterfaceData.IsTaskType(methodInfo.ReturnType) &&
                    !typeof(IAddressable).IsAssignableFrom(methodInfo.ReturnType))
                {
                    throw new InvalidOperationException(
                              string.Format("Unsupported return type {0}. Method Name={1} Declaring Type={2}",
                                            methodInfo.ReturnType.FullName, methodInfo.Name,
                                            TypeUtils.GetFullName(methodInfo.DeclaringType, language)));
                }

                returnType = CreateCodeTypeReference(methodInfo.ReturnType, language);
            }
            else
            {
                returnType = new CodeTypeReference(typeof(void));
            }

            var referenceMethod = new CodeMemberMethod
            {
                Name       = methodInfo.Name,
                ReturnType = returnType
            };

            foreach (var param in methodInfo.GetParameters())
            {
                var paramName = GetParameterName(param);
                CodeParameterDeclarationExpression p = param.ParameterType.IsGenericType
                    ? new CodeParameterDeclarationExpression(
                    TypeUtils.GetParameterizedTemplateName(param.ParameterType, true,
                                                           tt => CurrentNamespace != tt.Namespace && !ReferencedNamespaces.Contains(tt.Namespace), language),
                    paramName)
                    : new CodeParameterDeclarationExpression(param.ParameterType, paramName);

                p.Direction = FieldDirection.In;
                referenceMethod.Parameters.Add(p);
            }

            referenceMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            var pit = new CodeTypeReference(GetGenericTypeName(methodInfo.DeclaringType, type => { }, t => false));

            referenceMethod.PrivateImplementationType = pit;

            var methodImpl = new CodeSnippetStatement(GetBasicMethodImpl(methodInfo));

            referenceMethod.Statements.Add(methodImpl);
            return(referenceMethod);
        }
Esempio n. 2
0
        /// <summary>
        /// Generates a wrapper method that takes arguments of the original method.
        /// </summary>
        protected override CodeTypeMember GetBasicReferenceMethod(MethodInfo methodInfo, CodeTypeParameterCollection genericTypeParam, bool isObserver)
        {
            SerializerGenerationManager.RecordTypeToGenerate(methodInfo.ReturnType);
            foreach (ParameterInfo paramInfo in methodInfo.GetParameters())
            {
                SerializerGenerationManager.RecordTypeToGenerate(paramInfo.ParameterType);
            }

            if (!isObserver)
            {
                var parameterList = new StringBuilder();
                var first         = true;
                foreach (var p in methodInfo.GetParameters())
                {
                    if (!first)
                    {
                        parameterList.Append(", ");
                    }
                    first = false;
                    parameterList.AppendFormat("{0} As {1}", p.Name, GetGenericTypeName(p.ParameterType, type => { }, t => false));
                }

                var snippet = new StringBuilder();
                snippet.AppendFormat("Public Function {0}({1}) As {2} Implements {3}.{0}",
                                     methodInfo.Name,
                                     parameterList,
                                     GetGenericTypeName(methodInfo.ReturnType, type => { }, t => false),
                                     GetGenericTypeName(methodInfo.DeclaringType, type => { }, t => false))
                .AppendLine();
                snippet.AppendFormat("            {0}", GetBasicMethodImpl(methodInfo)).AppendLine();
                snippet.AppendLine("        End Function");
                return(new CodeSnippetTypeMember(snippet.ToString()));
            }

            var referenceMethod = new CodeMemberMethod
            {
                Name       = methodInfo.Name,
                ReturnType = GetReturnTypeReference(methodInfo.ReturnType, SerializeFlag.DeserializeResult)
            };

            foreach (var paramInfo in methodInfo.GetParameters())
            {
                referenceMethod.Parameters.Add(new CodeParameterDeclarationExpression(
                                                   new CodeTypeReference(paramInfo.ParameterType), GetParameterName(paramInfo)));
            }

            referenceMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            var pit = new CodeTypeReference(GetGenericTypeName(methodInfo.DeclaringType, type => { }, t => false));

            referenceMethod.PrivateImplementationType = pit;

            var methodImpl = new CodeSnippetStatement(GetBasicMethodImpl(methodInfo));

            referenceMethod.Statements.Add(methodImpl);
            return(referenceMethod);
        }