我正在使用Roslyn,并且我有以下类:
var source = @"
using System;
class MyClass : MyBaseClass {
static void Main(string[] args) {
Console.WriteLine(""Hello, World!"");
}
}";
// Parsing
SyntaxTree tree = CSharpSyntaxTree.ParseText(source);
// This uses an internal function (working)
// That gets the first node of type `SimpleBaseTypeSyntax`
SimpleBaseTypeSyntax simpleBaseType = GetNBaseClassNode(tree);
获取基类名称
我已经成功访问了包含我需要的内容的节点SimpleBaseTypeSyntax
。实际上,如果我使用语法资源管理器,我会得到以下结果:
节点IdentifierToken
的Text
、Value
和ValueText
属性均为"MyBaseClass"
,这正是我所需的!
然而,虽然在语法资源管理器中我可以看到所有这些值,但我无法通过编程方式访问它们。
因此,我尝试以编程方式检索节点:
IdentifierNameSyntax identifierNode =
simpleBaseType.ChildNodes().OfType<IdentifierNameSyntax>().First();
SyntaxToken identifier = simpleBaseType.Identifier;
string name = identifier.Text;
但是name
是空字符串。与identifier.Value
和identifier.ValueText
相同。
我做错了什么?也许我做错了,那么你将如何检索基类名称?
另一种尝试:使用语义模型
我开始思考我需要这种类型信息的语义模型:
IdentifierNameSyntax identifierNode =
simpleBaseType .ChildNodes().OfType<IdentifierNameSyntax>().First();
SemanticModel semanticModel =
CSharpCompilation.Create("Class")
.AddReferences(MetadataReference.CreateFromFile(
typeof(object).Assembly.Location))
.AddSyntaxTrees(tree).GetSemanticModel(tree);
SymbolInfo symbolInfo = this.semanticModel.GetSymbolInfo(identifierNode);
string name = symbolInfo.Symbol.Name;
当 symbolInfo.Symbol
为空时,会抛出异常。