示例#1
0
        private CodeMemberMethod GenerateMethod(MethodInfo method)
        {
            var memberMethod = _memberGenerator.GenerateMethodDeclaration(method);

            if (method.IsAsync())
            {
                memberMethod.ReturnType.BaseType = "async " + memberMethod.ReturnType.BaseType;
            }

            var targetVariable = method.IsAsync()
                                ? new CodeVariableReferenceExpression("await " + WrappedFieldName)
                                : new CodeVariableReferenceExpression(WrappedFieldName);

            CodeExpression invokeExpression =
                new CodeMethodInvokeExpression(
                    targetVariable,
                    memberMethod.Name,
                    memberMethod.Parameters.OfType <CodeParameterDeclarationExpression>()
                    .Select(p =>
            {
                CodeExpression variableExpression = new CodeVariableReferenceExpression(p.Name);

                if (p.Type.IsArray() && IsRegistered(p.Type.ArrayElementType.BaseType))
                {
                    return(InvokeConvertAllWrapper(variableExpression, p.Type.ArrayElementType.BaseType));
                }

                if (IsRegistered(p.Type.BaseType))
                {
                    variableExpression = new CodePropertyReferenceExpression(variableExpression, WrappedPropertyName);
                }

                return((CodeExpression) new CodeDirectionExpression(p.Direction, variableExpression));
            })
                    .ToArray()
                    );

            if (memberMethod.ReturnType.BaseType == "System.Void")
            {
                memberMethod.Statements.Add(invokeExpression);
            }
            else
            {
                if (IsRegistered(method.ReturnType))
                {
                    invokeExpression = new CodeObjectCreateExpression(
                        WrappedTypeDictionary.GetTypeNameFor(method.ReturnType),
                        invokeExpression
                        );
                }

                memberMethod.Statements.Add(new CodeMethodReturnStatement(invokeExpression));
            }

            return(memberMethod);
        }
        private void GenerateMethods(IReflect type, CodeTypeDeclaration contract)
        {
            var methods = type
                          .GetMethods(BindingFlags.Public | BindingFlags.Instance)
                          .Where(m => IsExcluded(m) == false);

            foreach (var method in methods)
            {
                contract.Members.Add(_memberGenerator.GenerateMethodDeclaration(method));
            }
        }