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