在Roslyn代码分析器中检查变量类型的正确方法是什么?我正在注册ObjectCreationExpressionSyntax
节点,我可以获取类型,但是我不确定检查它是否是我关心的类型的正确方法。
我找到了一种通过检查显示字符串来做到这一点的方法,但是我想知道是否有更正确的方法来完成此操作。例如,下面的代码正在尝试检查ArrayList的创建。
private static void SyntaxValidator(SyntaxNodeAnalysisContext context)
{
var creation = (ObjectCreationExpressionSyntax)context.Node;
var variableType = creation.Type as IdentifierNameSyntax;
if (variableType == null)
return;
var variableTypeInfo = context.SemanticModel.GetTypeInfo(context.Node);
if (variableTypeInfo.Type != null && variableTypeInfo.Type.ToDisplayString().Equals("System.Collections.ArrayList"))
{
context.ReportDiagnostic(Diagnostic.Create(Rule, creations.GetLocation(), ""));
}
}
进行此操作的正常模式是使用Compilation.GetTypeByMetadataName()
,然后将该ITypeSymbol
与您从SemanticModel.GetTypeInfo()
返回的那个进行比较。
注意:请确保使用.Equals
来比较ITypeSymbol
实例,因为其中某些实例不能保证引用身份。
请参阅http://sourceroslyn.io/Roslyn.Diagnostics.Analyzers/R/fee46febeb0be269.html以获取执行此操作的分析器示例。