Eli*_*gan 13 c# roslyn roslyn-code-analysis
在某些情况下,当我试图为我的语法节点获取ISymbol时,我在使用SemanticModel.GetSymbolInfo时失败(变为null)但在使用SemanticModel.GetDeclaredSymbol时成功.
我附上了一个例子.
所以我的问题是何时使用每种方法来获取语义模型?
public class Class1
{
public System.String MyString { get; set; }
public static void Main()
{
var str =
@"
namespace ClassLibrary31
{
public class Class1
{
public System.String MyString { get; set; }
}
}";
var syntaxTree = SyntaxFactory.ParseSyntaxTree(str);
MetadataReference[] metadataReferenceReferences = new MetadataReference[]
{
MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
};
var compilation =
CSharpCompilation
.Create("TraceFluent",
new[] {syntaxTree},
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, warningLevel:1),
references: metadataReferenceReferences
);
var temp = compilation.Emit("temp");
var semanticModel = compilation.GetSemanticModel(syntaxTree, true);
PropertyDeclarationSyntax propertySyntaxNode =
syntaxTree.GetRoot()
.DescendantNodes()
.OfType<PropertyDeclarationSyntax>()
.First();
//var qu = propertySyntaxNode.q
//var symbolInfo = semanticModel.GetDeclaredSymbol(propertySyntaxNode);
var symbol = semanticModel.GetDeclaredSymbol(propertySyntaxNode) as IPropertySymbol;
var typeInfo = semanticModel.GetTypeInfo(propertySyntaxNode).Type;
}
}
Run Code Online (Sandbox Code Playgroud)
我相信你的意思是获取给定语法节点的符号,而不是获取树的语义模型.
通常,当你想获得声明的基础符号(类,属性,方法......)时,你应该使用GetDeclaredSymbol.在内部,GetSymbolInfo调用此方法.你可以看到那里处理的不同案件.声明不会被处理,所以对于那些你需要使用的声明GetDeclaredSymbol,你可以在这里找到它们的内部结构.