如何使用 Roslyn 独立分析从别名获取类型
How to get type from alias using Roslyn standalone analysis
如果我在源代码中使用类型别名:
using Something = DateTime;
然后我会提到它的成员:
var date = Something.Now;
当我使用 Roslyn 分析语法树时,我将有一个 SimpleMemberAccessExpression for Something 不知道它只是 DateTime.
的别名
有没有办法知道 Something 是语义上的别名?我不想解析整个文件并跟踪所有别名。
要获得成员的类型,您需要使用语义模型对其进行解析。
对于以下代码,我假设您有一个 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 是实际类型而不是别名 - typeName 将对应于 DateTime
如果我在源代码中使用类型别名:
using Something = DateTime;
然后我会提到它的成员:
var date = Something.Now;
当我使用 Roslyn 分析语法树时,我将有一个 SimpleMemberAccessExpression for Something 不知道它只是 DateTime.
的别名有没有办法知道 Something 是语义上的别名?我不想解析整个文件并跟踪所有别名。
要获得成员的类型,您需要使用语义模型对其进行解析。
对于以下代码,我假设您有一个 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 是实际类型而不是别名 - typeName 将对应于 DateTime