2015-01-30 1 views
12

내가 Roslyn과 코드 분석기를 쓰고있어 ExpressionSyntaxTask 또는 Task<T> 유형인지 확인해야합니다.Roslyn 분석기에서 표현식의 유형을 확인하는 올바른 방법은 무엇입니까?

지금까지 나는이 있습니다

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>을 위해 ... 나는 이름과 네임 스페이스를 확인할 수 있습니다,하지만 그것은 비현실적이다 "네임 스페이스의.

권장되는 방법은 없나요?

+0

필자는 거의 같은 질문을했지만 더 일반적으로 표현식이이 질문과 같은 특정 유형이 아닌 특정 유형과 일치하는지 확인하는 방법입니다. [내 답변보기] (http://stackoverflow.com/a/33994426/3568661) 전체 코드 샘플은 여기 –

답변

6

유형이 is a generic type인지 확인하고 허용되는 경우 OriginalDefinition을 사용하여 구조화되지 않은 제네릭 유형을 반환하십시오.

+1

고마워! 'ITypeInfo'가 실제로'INamedTypeSymbol' 이었기 때문에'IsGeneric' 속성을 볼 수 없었습니다. 그러나'ConstructUnboundGenericType'은'Task '이 아니라'Task <>'를 주므로'GetTypeFromMetadataName'으로 얻을 수있는 타입과 일치하지 않습니다. 대신 [ConstructedFrom'] (http://source.roslyn.io/#Microsoft.CodeAnalysis/Symbols/INamedTypeSymbol.cs,2b034eb9d8cd5598) 속성을 사용해야했습니다. –

+2

'OriginalDefinition'을 사용하십시오 - 모든 경우에 GetTypeByMetadataName과 일치하는 유형을 제공합니다. 중첩 된 제네릭 또는 제네릭 메서드의 경우 ConstructedFrom은 사용자가 원하는 것이 아닙니다. –

+0

@JasonMalinowski, 감사합니다! –