Ответ 1
Проверьте, является ли тип общим типом, и, если это так, используйте OriginalDefinition
, чтобы вернуть неконструированный общий тип.
Я пишу анализатор кода с 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>
... Я мог проверить имя и пространство имен, но это непрактично, потому что я должен проверять каждый "уровень" пространства имен.
Есть ли рекомендуемый способ сделать это?
Проверьте, является ли тип общим типом, и, если это так, используйте OriginalDefinition
, чтобы вернуть неконструированный общий тип.