public void Build()
        {
            var workspace = new AdhocWorkspace();
            var generator = SyntaxGenerator.GetGenerator(workspace, LanguageNames.CSharp);

            var classDecl = generator.StructDeclaration(_declaration.CSharpName + "Association",
                                                        accessibility: Accessibility.Public);
            var members = new List <SyntaxNode>();

            members.Add(SyntaxFactory.FieldDeclaration(SyntaxFactory.VariableDeclaration(SyntaxHelper.AssociationResolverType))
                        .AddDeclarationVariables(SyntaxFactory.VariableDeclarator("_resolver").WithInitializer(
                                                     SyntaxFactory.EqualsValueClause(SyntaxFactory.ParseExpression(
                                                                                         $"new AssociationResolver(\"{_declaration.Name}\", \"{_sourceProperty.ReferenceClassName}\", \"{_targetProperty.ReferenceClassName}\", \"{_sourceProperty.Name}\", \"{_targetProperty.Name}\")"))
                                                     ))
                        .AddModifiers(SyntaxHelper.Private, SyntaxHelper.Static));

            members.Add(SyntaxFactory.FieldDeclaration(SyntaxFactory.VariableDeclaration(SyntaxHelper.IInfrastructureObjectScopeType))
                        .AddDeclarationVariables(SyntaxFactory.VariableDeclarator("_scope"))
                        .AddModifiers(SyntaxHelper.Private));

            members.Add(SyntaxFactory.ConstructorDeclaration(_declaration.CSharpName + "Association")
                        .AddModifiers(SyntaxHelper.Public)
                        .AddParameterListParameters(
                            SyntaxFactory.Parameter(SyntaxFactory.Identifier("scope")).WithType(SyntaxHelper.IInfrastructureObjectScopeType)
                            )
                        .WithBody(SyntaxHelper.ParseBlock("_scope = scope;"))
                        );

            var targetReturnType = _targetProperty.ResolveType(_typeRepository, out var targetIsCimObject);
            var sourceReturnType = _sourceProperty.ResolveType(_typeRepository, out var sourceIsCimObject);

            members.Add(SyntaxFactory.MethodDeclaration(SyntaxHelper.EnumerableOf(targetReturnType), _targetProperty.Name)
                        .AddModifiers(SyntaxHelper.Public)
                        .AddParameterListParameters(
                            SyntaxFactory.Parameter(SyntaxFactory.Identifier("in" + _sourceProperty.Name)).WithType(sourceReturnType),
                            SyntaxFactory.Parameter(SyntaxFactory.Identifier("options")).WithType(SyntaxHelper.CimOperationOptionsType)
                            .WithDefault(
                                SyntaxFactory.EqualsValueClause(SyntaxFactory.ParseExpression("null"))
                                )
                            )
                        .WithBody(SyntaxHelper.ParseBlock(
                                      "var scope = _scope;",
                                      $"var instances = _resolver.ResolveTarget(scope, in{_sourceProperty.Name}{(sourceIsCimObject ? ".AsCimInstance()" : string.Empty)}, options);",
                                      targetIsCimObject ? $"return instances.Select(i => ({targetReturnType})scope.Mapper.Create(scope, i));" : "return instances;"
                                      )
                                  ));

            members.Add(SyntaxFactory.MethodDeclaration(SyntaxHelper.EnumerableOf(sourceReturnType), _sourceProperty.Name)
                        .AddModifiers(SyntaxHelper.Public)
                        .AddParameterListParameters(
                            SyntaxFactory.Parameter(SyntaxFactory.Identifier("in" + _targetProperty.Name)).WithType(targetReturnType),
                            SyntaxFactory.Parameter(SyntaxFactory.Identifier("options")).WithType(SyntaxHelper.CimOperationOptionsType)
                            .WithDefault(
                                SyntaxFactory.EqualsValueClause(SyntaxFactory.ParseExpression("null"))
                                )
                            )
                        .WithBody(SyntaxHelper.ParseBlock(
                                      "var scope = _scope;",
                                      $"var instances = _resolver.ResolveSource(scope, in{_targetProperty.Name}{(targetIsCimObject ? ".AsCimInstance()" : string.Empty)}, options);",
                                      sourceIsCimObject ? $"return instances.Select(i => ({sourceReturnType})scope.Mapper.Create(scope, i));" : "return instances;"
                                      )
                                  ));


            members.Add(SyntaxFactory.MethodDeclaration(SyntaxHelper.ObservableOf(targetReturnType), _targetProperty.Name + "Async")
                        .AddModifiers(SyntaxHelper.Public)
                        .AddParameterListParameters(
                            SyntaxFactory.Parameter(SyntaxFactory.Identifier("in" + _sourceProperty.Name)).WithType(sourceReturnType),
                            SyntaxFactory.Parameter(SyntaxFactory.Identifier("options")).WithType(SyntaxHelper.CimOperationOptionsType)
                            .WithDefault(
                                SyntaxFactory.EqualsValueClause(SyntaxFactory.ParseExpression("null"))
                                )
                            )
                        .WithBody(SyntaxHelper.ParseBlock(
                                      "var scope = _scope;",
                                      $"var instances = _resolver.ResolveTargetAsync(scope, in{_sourceProperty.Name}{(sourceIsCimObject ? ".AsCimInstance()" : string.Empty)}, options);",
                                      targetIsCimObject ? $"return instances.Select(i => ({targetReturnType})scope.Mapper.Create(scope, i));" : "return instances;"
                                      )
                                  ));

            members.Add(SyntaxFactory.MethodDeclaration(SyntaxHelper.ObservableOf(sourceReturnType), _sourceProperty.Name + "Async")
                        .AddModifiers(SyntaxHelper.Public)
                        .AddParameterListParameters(
                            SyntaxFactory.Parameter(SyntaxFactory.Identifier("in" + _targetProperty.Name)).WithType(targetReturnType),
                            SyntaxFactory.Parameter(SyntaxFactory.Identifier("options")).WithType(SyntaxHelper.CimOperationOptionsType)
                            .WithDefault(
                                SyntaxFactory.EqualsValueClause(SyntaxFactory.ParseExpression("null"))
                                )
                            )
                        .WithBody(SyntaxHelper.ParseBlock(
                                      "var scope = _scope;",
                                      $"var instances = _resolver.ResolveSourceAsync(scope, in{_targetProperty.Name}{(targetIsCimObject ? ".AsCimInstance()" : string.Empty)}, options);",
                                      sourceIsCimObject ? $"return instances.Select(i => ({sourceReturnType})scope.Mapper.Create(scope, i));" : "return instances;"
                                      )
                                  ));


            classDecl = generator.AddMembers(classDecl, members);

            var namespaceDecl = generator.NamespaceDeclaration(_options.CSharpNamespace, classDecl);


            var finalDoc = generator.CompilationUnit(
                generator.NamespaceImportDeclaration("Microsoft.Management.Infrastructure"),
                generator.NamespaceImportDeclaration("Microsoft.Management.Infrastructure.Options"),
                generator.NamespaceImportDeclaration("SimCim.Core"),
                generator.NamespaceImportDeclaration("System"),
                generator.NamespaceImportDeclaration("System.Collections.Generic"),
                generator.NamespaceImportDeclaration("System.Linq"),
                generator.NamespaceImportDeclaration("System.Reactive.Linq"),
                namespaceDecl).NormalizeWhitespace();

            File.WriteAllText(Path.Join(_options.OutputDir, "Association" + _declaration.CSharpName + ".cs"), finalDoc.ToFullString(), Encoding.UTF8);
        }