Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从SemanticModel中为新创建的类获取声明的符号?_C#_Roslyn_.net 4.6 - Fatal编程技术网

C# 如何从SemanticModel中为新创建的类获取声明的符号?

C# 如何从SemanticModel中为新创建的类获取声明的符号?,c#,roslyn,.net-4.6,C#,Roslyn,.net 4.6,从我刚刚创建的ClassDeclaration中获取ISymbol的最简单方法是什么 考虑以下代码: AdhocWorkspace workspace = new AdhocWorkspace(); Project project = workspace.AddProject("Test", LanguageNames.CSharp); ClassDeclarationSyntax classDeclaration = SyntaxFactory.ClassDeclarati

从我刚刚创建的
ClassDeclaration
中获取
ISymbol
的最简单方法是什么

考虑以下代码:

AdhocWorkspace workspace = new AdhocWorkspace();         
Project project = workspace.AddProject("Test", LanguageNames.CSharp);

ClassDeclarationSyntax classDeclaration = SyntaxFactory.ClassDeclaration("MyClass");
CompilationUnitSyntax compilationUnit = SyntaxFactory.CompilationUnit().AddMembers(classDeclaration);         
Document document = project.AddDocument("Test.cs", compilationUnit);
SemanticModel semanticModel = await document.GetSemanticModelAsync();
ISymbol symbol = semanticModel.GetDeclaredSymbol(classDeclaration); // <-- Throws Exception
AdhocWorkspace=new AdhocWorkspace();
Project=workspace.AddProject(“Test”,LanguageNames.CSharp);
ClassDeclarationSyntax classDeclaration=SyntaxFactory.classDeclaration(“MyClass”);
CompilationUnitSyntax compilationUnit=SyntaxFactory.compilationUnit().AddMembers(类声明);
文档文件=project.AddDocument(“Test.cs”,编译单元);
SemanticModel SemanticModel=等待文档。GetSemanticModelAsync();
ISymbol symbol=semanticModel.GetDeclaredSymbol(类声明);// 您可以使用来跟踪类节点:

AdhocWorkspace workspace = new AdhocWorkspace();
Project project = workspace.AddProject("Test", LanguageNames.CSharp);

//Attach a syntax annotation to the class declaration
var syntaxAnnotation = new SyntaxAnnotation("ClassTracker");
var classDeclaration = SyntaxFactory.ClassDeclaration("MyClass")
    .WithAdditionalAnnotations(syntaxAnnotation);

var compilationUnit = SyntaxFactory.CompilationUnit().AddMembers(classDeclaration);

Document document = project.AddDocument("Test.cs", compilationUnit);
SemanticModel semanticModel = document.GetSemanticModelAsync().Result;

//Use the annotation on our original node to find the new class declaration
var changedClass = document.GetSyntaxRootAsync().Result.DescendantNodes().OfType<ClassDeclarationSyntax>()
    .Where(n => n.HasAnnotation(syntaxAnnotation)).Single();
var symbol = semanticModel.GetDeclaredSymbol(changedClass);
AdhocWorkspace=new AdhocWorkspace();
Project=workspace.AddProject(“Test”,LanguageNames.CSharp);
//将语法注释附加到类声明
var syntaxAnnotation=新syntaxAnnotation(“ClassTracker”);
var classDeclaration=SyntaxFactory.classDeclaration(“MyClass”)
.带有附加注释(Syntax注释);
var compilationUnit=SyntaxFactory.compilationUnit().AddMembers(类声明);
文档文件=project.AddDocument(“Test.cs”,编译单元);
SemanticModel SemanticModel=document.GetSemanticModelAsync().Result;
//使用原始节点上的注释查找新的类声明
var changedClass=document.GetSyntaxRootAsync().Result.DegenantNodes().OfType()的
.Where(n=>n.hasaAnnotation(syntaxAnnotation)).Single();
var symbol=semanticModel.GetDeclaredSymbol(changedClass);

无论您最终将类添加到哪种复杂文档中,这都应该是有效的。

如果您没有创建语法节点,该怎么做?我找到了一个语法节点,需要在转换后再次找到它。但是,当我在变异前的节点上调用带有附加注释的
时,我得到的语法节点没有
父节点
@AndrewArnott,我想你需要先找到你的节点及其父节点。然后使用AdditionalAnnotations()调用
,并保存该节点。我认为您可以调用
parent.ReplaceNode(newNodeWithAnnotations)
@AndrewArnott也可能
DocumentEditor
CSharpSyntaxRewriter
更适合您的目的。我发现它们在对语法树进行大量更改时更易于使用。@JoshVarty我能用Roslyn以编程方式创建新的.csproj和sln并将其保存到文件吗?@Konrad据我所知,你不能用Roslyn添加/保存新的
.csproj
.sln
。请看:据我回忆,他们会接受社区在这个问题上的贡献,但他们自己并没有在做这件事。