Пример #1
0
        private static CompilationUnitSyntax GenerateSyntax(BasicData data, IEnumerable <DependecyData> contexDependecies)
        {
            var compilationUnit = SyntaxFactory.CompilationUnit();

            compilationUnit = compilationUnit.AddUsings(data.Usings);

            var @namespace       = SyntaxFactoryEx.NamespaceDeclaration(data.Namespace);
            var classDeclaration = SyntaxFactoryEx.InternalClassDeclaration(data.HandlerName);

            var typeArgumentList = new List <TypeSyntax>();

            typeArgumentList.Add(SyntaxFactory.IdentifierName(data.CommandName + data.CommandTypeArguments));
            if (data.ReturnType != null)
            {
                typeArgumentList.Add(data.ReturnType);
            }
            classDeclaration = classDeclaration.AddBaseListTypes(SyntaxFactory.SimpleBaseType(SyntaxFactory.GenericName(SyntaxFactory.Identifier("IRequestHandler")).AddTypeArgumentListArguments(typeArgumentList.ToArray())));

            var constructor  = GenerateConstructor(data.HandlerName, contexDependecies);
            var handleMethod = GenerateHandleMethod(data);
            var members      = new MemberDeclarationSyntax[] { constructor, handleMethod };

            classDeclaration = classDeclaration.AddMembers(members);
            @namespace       = @namespace.AddMembers(classDeclaration);
            compilationUnit  = compilationUnit.AddMembers(@namespace);
            var code = compilationUnit.NormalizeWhitespace();

            return(code);
        }
        public static CompilationUnitSyntax CreateParameterObjectClass(ParameterObject parameterObject, IEnumerable <ParameterSyntax> parameters)
        {
            var compilationUnit = SyntaxFactory.CompilationUnit();

            compilationUnit = compilationUnit.AddUsings(parameterObject.Usings);
            var @namespace       = SyntaxFactoryEx.NamespaceDeclaration(parameterObject.Namespace);
            var classDeclaration = SyntaxFactoryEx.InternalClassDeclaration(parameterObject.Name);

            var members = new List <MemberDeclarationSyntax>();

            foreach (var property in parameterObject.Properties)
            {
                var propertyDeclaration = SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName(property.Type), property.PropertyName)
                                          .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
                                          .AddAccessorListAccessors(
                    SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),
                    SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)));

                members.Add(propertyDeclaration);
            }

            var body = new List <StatementSyntax>();

            foreach (var property in parameterObject.Properties)
            {
                var assignment = SyntaxFactory.ExpressionStatement
                                 (
                    SyntaxFactory.AssignmentExpression
                    (
                        SyntaxKind.SimpleAssignmentExpression,
                        SyntaxFactory.IdentifierName(property.PropertyName),
                        SyntaxFactory.IdentifierName(property.ParameterName)
                    )
                                 );
                body.Add(assignment);
            }

            var constructor = SyntaxFactory.ConstructorDeclaration(SyntaxFactory.Identifier(parameterObject.Name))
                              .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
                              .AddParameterListParameters(parameters.ToArray())
                              .AddBodyStatements(body.ToArray());

            members.Add(constructor);

            classDeclaration = classDeclaration.AddMembers(members.ToArray());
            @namespace       = @namespace.AddMembers(classDeclaration);
            compilationUnit  = compilationUnit.AddMembers(@namespace);
            var code = compilationUnit.NormalizeWhitespace();

            return(code);
        }