Ich schreibe einen Code-Analysator mit Roslyn, und ich muss überprüfen, ob ein ExpressionSyntax
vom Typ Task
oder Task<T>
ist.Korrekte Möglichkeit, den Typ eines Ausdrucks im Roslyn Analyzer zu überprüfen?
Bisher habe ich dies:
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;
}
Es funktioniert für Task
, aber nicht für Task<int>
oder Task<string>
... Ich konnte den Namen und Namensraum überprüfen, aber es ist unpraktisch, weil ich jede „Ebene überprüfen "des Namensraums.
Gibt es einen empfohlenen Weg, dies zu tun?
Ich hatte fast die gleiche Frage, aber allgemeiner: Wie überprüft man, ob ein Ausdruck mit einem bestimmten Typ übereinstimmt, nicht mit einem bestimmten Typ wie in dieser Frage. [Siehe meine Antwort] (http://stackoverflow.com/a/33994426/3568661) mit voller Codebeispiel hier –