检查属性,方法是否存在于现有的类中

时间:2019-07-15 10:56:03

标签: c# roslyn

作为我一直在努力的代码生成框架的一部分,我已经成功地将包含构造函数,方法,属性和字段的类生成到每个类的文件中。我创建了一个建模工具,可以用来捕获业务领域。模型中的元数据是驱动代码生成过程的因素。

目前,每次运行生成器时,我都会覆盖每个类文件,替换生成的c#类文件的内容。

现在而不是覆盖,我想检查成员是否已存在于具有相同参数签名的现有类中,如果找到,则不会将该成员添加到类中。

例如,如果我改变了方法的参数列表或返回类型,那么我会将那个方法添加到现有的类中。

任何更改都将添加到现有类中,并保存到文件中。

通过这种方式,如果我在生成过程之外编辑类,则在重新生成类时不会丢失那些更改。

下面的代码段显示了一个示例,该示例说明了在现有文件(如果存在)或从新文件生成类的情况下从哪里创建编译单元的示例。

我正在寻找一些不错的Roslyn代码示例,这些示例说明如何枚举给定的编译单元,并检查是否存在成员名称和参数签名。

  // Create Properties within class
        var propertyList = RoslynUtilities.GetPropertiesList(props.OrderBy(m=>m.Name).ToList());

        // Check if class has already been generated
        if (FileOperations.FileExists(targetSourceFilePath))
        {
            // Create CompilationUnit from exsiting file
            var file = FileOperations.ReadModelFile(targetSourceFilePath);
            compUnit = RoslynQuoter.Quoter.Parse(file, RoslynQuoter.NodeKind.CompilationUnit) as CompilationUnitSyntax;

            // Sample code to enumerate members..
            var members = compUnit.SyntaxTree.GetRoot().DescendantNodes().OfType<MemberDeclarationSyntax>();

            foreach (var member in members)
            {
                var property = member as PropertyDeclarationSyntax;
                if (property != null)
                    Console.WriteLine("Property: " + property.Identifier);
                var method = member as MethodDeclarationSyntax;
                if (method != null)
                    Console.WriteLine("Method: " + method.Identifier);
            }
        }
        else
        {
            // Create Class 
            {
                compUnit = SyntaxFactory.CompilationUnit()
                    .WithMembers(SyntaxFactory.SingletonList<MemberDeclarationSyntax>(RoslynUtilities
                        .GetNameSpace(classNameSpace)
                        .WithMembers(SyntaxFactory.SingletonList<MemberDeclarationSyntax>(SyntaxFactory
                            .ClassDeclaration(className)
                            .WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword),
                                SyntaxFactory.Token(SyntaxKind.PartialKeyword)))
                            .WithBaseList(SyntaxFactory.BaseList(SyntaxFactory.SeparatedList<BaseTypeSyntax>(
                                GetBaseListTypes(domainContext))))))))
                    .NormalizeWhitespace();
            }
        }

0 个答案:

没有答案