Пример #1
0
        protected override string GetInvokeArguments(MethodInfo methodInfo)
        {
            var invokeArguments = string.Empty;
            int count           = 1;
            var parameters      = methodInfo.GetParameters();

            foreach (ParameterInfo paramInfo in parameters)
            {
                if (paramInfo.ParameterType.GetInterface("Orleans.Runtime.IAddressable") != null && !typeof(GrainReference).IsAssignableFrom(paramInfo.ParameterType))
                {
                    invokeArguments += string.Format("If(typeof({0}) is Global.Orleans.Grain,{2}.{1}.Cast({0}.AsReference()),{0})",
                                                     GrainInterfaceData.GetParameterName(paramInfo),
                                                     GrainInterfaceData.GetFactoryClassForInterface(paramInfo.ParameterType),
                                                     paramInfo.ParameterType.Namespace);
                }
                else
                {
                    invokeArguments += GrainInterfaceData.GetParameterName(paramInfo);
                }

                if (count++ < parameters.Length)
                {
                    invokeArguments += ", ";
                }
            }
            return(invokeArguments);
        }
Пример #2
0
        /// <summary>
        /// Generate any safeguard check statements for the generated Invoke for the specified method
        /// </summary>
        /// <param name="methodInfo">The method for which the invoke is being generated for </param>
        /// <returns></returns>
        protected virtual string GetParamGuardCheckStatements(MethodInfo methodInfo)
        {
            var paramGuardStatements = new StringBuilder();

            foreach (ParameterInfo p in methodInfo.GetParameters())
            {
                // For any parameters of type IGrainObjerver, the object passed at runtime must also be a GrainReference
                if (typeof(IGrainObserver).IsAssignableFrom(p.ParameterType))
                {
                    paramGuardStatements.AppendLine(string.Format(@"GrainFactoryBase.CheckGrainObserverParamInternal({0});",
                                                                  GrainInterfaceData.GetParameterName(p)));
                }
            }
            return(paramGuardStatements.ToString());
        }
Пример #3
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}\n",
                                     methodInfo.Name,
                                     parameterList,
                                     GetGenericTypeName(methodInfo.ReturnType, type => { }, t => false),
                                     GetGenericTypeName(methodInfo.DeclaringType, type => { }, t => false));
                snippet.AppendFormat("            {0}\n", GetBasicMethodImpl(methodInfo));
                snippet.Append("        End Function\n");
                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), GrainInterfaceData.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);
        }
Пример #4
0
 /// <summary>
 /// Returns the C# name for the provided <paramref name="parameter"/>.
 /// </summary>
 /// <param name="parameter">The parameter.</param>
 /// <returns>The C# name for the provided <paramref name="parameter"/>.</returns>
 protected override string GetParameterName(ParameterInfo parameter)
 {
     return("@" + GrainInterfaceData.GetParameterName(parameter));
 }
Пример #5
0
 /// <summary>
 /// Returns the Visual Basic name for the provided <paramref name="parameter"/>.
 /// </summary>
 /// <param name="parameter">The parameter.</param>
 /// <returns>The Visual Basic name for the provided <paramref name="parameter"/>.</returns>
 protected override string GetParameterName(ParameterInfo parameter)
 {
     return(string.Format("[{0}]", GrainInterfaceData.GetParameterName(parameter)));
 }