如果我在源代码中使用类型别名:
using Something = DateTime;
然后我引用其成员:
var date = Something.Now;
当我用 Roslyn 分析语法树时,对于 Something 我会有一个 SimpleMemberAccessExpression ,而不知道它只是一个别名 DateTime 。
有没有办法知道 Something 在语义上是别名?我不想解析整个文件并跟踪所有别名。
答案 0 :(得分:3)
要获得您需要使用语义模型解决它的成员类型。
对于下面这段代码,我假设您有一个Document或者可以获得SyntaxTree和SemanticModel:
public static async Task GetNameFromDocument(Document document)
{
var syntaxTree = await document.GetSyntaxTreeAsync();
var semanticModel = await document.GetSemanticModelAsync();
var root = syntaxTree.GetRoot();
MemberAccessExpressionSyntax member = GetMemberAccessExpressionSyntax(root);
if (member != null)
{
var firstChild = member.ChildNodes().ElementAt(0);
var typeInfo = semanticModel.GetTypeInfo(firstChild).Type as INamedTypeSymbol;
var typeName = typeInfo.Name;
}
}
public static MemberAccessExpressionSyntax GetMemberAccessExpressionSyntax(SyntaxNode node)
{
return node.DescendantNodes().Where(curr => curr is MemberAccessExpressionSyntax)
.ToList().FirstOrDefault() as MemberAccessExpressionSyntax;
}
使用SyntaxTree查找表达式 - 但是您认为合适(因此必须替换GetMemberAccessExpressionSyntax) - 然后可以使用语义模型来解析MemberAccessExpression的类型。
MemberAccessExpressionSyntax的第一个子节点应始终是被访问的成员,因此您可以使用语义模型获取节点并获取其类型。提供的Type是acutal类型而不是alias - typeName将对应DateTime