当前位置: 首页 > 编程语言 > C#

查找所有不使用Roslyn继承的C#类,改为从基对象继承(类似java)分享

时间:2023-04-11 00:52:28 C#

查找所有不使用Roslyn继承的C#类,改为从基对象继承(类似于java)我正在开发一个小型Roslyn项目,包括更改解析树并将更改写回文件。我已经开始使用独立的代码分析器,并希望将其构建为命令行应用程序。但是,我遇到了挑战。使用:Find部分使用Roslyn从特定基类派生类,主要使用:https://github.com/dotnet/roslyn/wiki/Getting-Started-C%23-Syntax-Analysis我创建了这个小项目:class程序{staticvoidMain(string[]args){try{if(args.Length<1)thrownewArgumentException();SyntaxTree树=CSharpSyntaxTree.ParseText(File.ReadAllText(args[0]));varroot=(CompilationUnitSyntax)tree.GetRoot();varclasses=fromClassDeclarationSyntaxinroot.DescendantNodesAndSelf()选择ClassDeclarationSyntax;foreach(varcinclasses){if(/*不继承*/){/*添加继承*/}}/*将更改写入文件*/}catch(Exceptione){Console.WriteLine("发生致命错误。");Console.WriteLine(e.Message);控制台.WriteLine(e.StackTrace);}}}如代码所示,我需要检查类是否继承了某些东西(并选择第二个选项),然后更改解析树,最后将其写入文件,现在我很高兴知道如何检查“不继承”只是,尽管也欢迎第二个和三个步骤中的任何指针。要解析和更改的文件由路径作为程序参数提供:if(args.Length<1)thrownewArgumentException();SyntaxTree树=CSharpSyntaxTree.ParseText(File.ReadAllText(args[0]));在答案的支持下,我想出了一个可以工作的应用程序。这是我的代码,可能不完美但有效classProgram{staticvoidMain(string[]args){try{if(args.Length<1)thrownewArgumentException();SyntaxTree树=CSharpSyntaxTree.ParseText(File.ReadAllText(args[0]));varroot=(CompilationUnitSyntax)tree.GetRoot();IdentifierNameSyntaxiname=SyntaxFactory.IdentifierName("Object");BaseTypeSyntaxbts=SyntaxFactory.SimpleBaseType(iname);SeparatedSyntaxListssl=newSeparatedSyntaxList();ssl=ssl.Add(bts);BaseListSyntaxbls=SyntaxFactory.BaseList(ssl);布尔x=真;while(x)//由于无法在foreach中处理多个节点而处理所有节点的方式{foreach(varcinroot.DescendantNodesAndSelf()){x=false;varclassDeclaration=casClassDeclarationSyntax;如果(classDeclaration==null)继续;if(classDeclaration.BaseList!=null)//继承继续;else//不继承{root=root.ReplaceNode(classDeclaration,classDeclaration.WithBaseList(bls));x=真;休息;}}}我f(args.Length>1)//写入给定文件使用(varsw=newStreamWriter(File.Open(args[1],FileMode.Open))){root.WriteTo(sw);}else//使用覆盖源(varsw=newStreamWriter(File.Open(args[0],FileMode.Open))){root.WriteTo(sw);}}catch(Exceptione){Console.WriteLine("发生致命错误。");Console.WriteLine(e.Message);控制台.WriteLine(e.StackTrace);}}}ClassDeclarationSyntax有一个包含类型的BaseList,因此您可以使用以下字段检索有关基类的信息:foreach(varcincorrectRoot.DescendantNodesAndSelf()){如果(classDeclaration==null){继续;}if(classDeclaration.BaseList?.Types.Count>0){Console.WriteLine("这个类有基类或者它实现了接口");}else{/*Addinheritance*/}}不幸的是,你需要额外的逻辑来区分你的类是否有一个基类或者它只是实现了一个接口。如果要解决这个问题,需要使用语义模型分析底层对象(类/接口),得到对应的ISymbol的信息,或者尝试在语法树中找到这些节点的声明(如果这个声明是在您的项目/解决方案中定义)。另外,如果要给类添加继承,需要使用SyntaxFactory.SimpleBaseType(...)和SyntaxFactory.BaseList(...)将新建的节点设置为BaseListSyntaxFactory.BaseList(...)以上是C#学习教程:把没有使用RoslyninheritanceC#类的内容全部找出来改成从基础对象继承(类似java)。不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: