在 Roslyn 分析器中检查表达式类型的正确方法?
Correct way to check the type of an expression in Roslyn analyzer?
我正在用 Roslyn 编写代码分析器,我需要检查 ExpressionSyntax
的类型是 Task
还是 Task<T>
。
到目前为止我有这个:
private static bool IsTask(ExpressionSyntax expression, SyntaxNodeAnalysisContext context)
{
var type = context.SemanticModel.GetTypeInfo(expression).Type;
if (type == null)
return false;
if (type.Equals(context.SemanticModel.Compilation.GetTypeByMetadataName("System.Threading.Tasks.Task")))
return true;
if (type.Equals(context.SemanticModel.Compilation.GetTypeByMetadataName("System.Threading.Tasks.Task`1")))
return true;
return false;
}
它适用于 Task
,但不适用于 Task<int>
或 Task<string>
...我可以检查名称和命名空间,但这不切实际,因为我必须检查每个 "level" 的命名空间。
有推荐的方法吗?
检查类型is a generic type, and, if it is, use OriginalDefinition
是否为return未构造的泛型类型。
如果您需要符号而不是语法
INamedTypeSymbol nulable = compilation.GetTypeByMetadataName("System.Nullable`1");
INamedTypeSymbol int32 = compilation.GetSpecialType(SpecialType.System_Int32);
INamedTypeSymbol nulableInt = nulable.Construct(int32);
我正在用 Roslyn 编写代码分析器,我需要检查 ExpressionSyntax
的类型是 Task
还是 Task<T>
。
到目前为止我有这个:
private static bool IsTask(ExpressionSyntax expression, SyntaxNodeAnalysisContext context)
{
var type = context.SemanticModel.GetTypeInfo(expression).Type;
if (type == null)
return false;
if (type.Equals(context.SemanticModel.Compilation.GetTypeByMetadataName("System.Threading.Tasks.Task")))
return true;
if (type.Equals(context.SemanticModel.Compilation.GetTypeByMetadataName("System.Threading.Tasks.Task`1")))
return true;
return false;
}
它适用于 Task
,但不适用于 Task<int>
或 Task<string>
...我可以检查名称和命名空间,但这不切实际,因为我必须检查每个 "level" 的命名空间。
有推荐的方法吗?
检查类型is a generic type, and, if it is, use OriginalDefinition
是否为return未构造的泛型类型。
如果您需要符号而不是语法
INamedTypeSymbol nulable = compilation.GetTypeByMetadataName("System.Nullable`1");
INamedTypeSymbol int32 = compilation.GetSpecialType(SpecialType.System_Int32);
INamedTypeSymbol nulableInt = nulable.Construct(int32);