2017-04-04 5 views
0

제목에서 언급했듯이 메서드의 반환 형식이 일반적인 경우 params 메서드가 generic인지 확인하고 싶습니다. 예를 들어메소드 매개 변수 유형/반환 유형이 Roslyn에서 일반인지 확인하는 방법은 무엇입니까?

:

여기
public ISet<string> Collect(MethodDeclarationSyntax method, SemanticModel semanticModel) 
    { 
     return method 
      .ParameterList 
      .Parameters 
      .Select(x => x.Type.ToString()) 
      .ToImmutableHashSet(); 
    } 

나는 일반 아닌 method 변수에 대한 PARAMS의 모든 유형을 반환하려면,하지만 난 결과를 필터링 할 수있는 API에서 아무것도 찾을 수 없습니다.

메서드의 반환 형식이 일반적인 지 확인하는 경우에도 동일한 문제가 발생합니다.

+0

명확히하기 위해, 타입이'List '또는'Dictionary .KeyCollection'과 같은 것인지 알아 내려고하고 있습니까? – svick

+0

아니요 - params/return 값이 일반적인 지 알고 싶습니다. 'public static TValue GetOrDefault (TKey 키)' 'key'매개 변수가 generic인지, 반환 값 'TValue'도 generic인지 알고 싶습니다. –

+0

좋아요, 그래서'ITypeSymbol.TypeKind'에 액세스하여 내가 원하는 것을 찾았습니다. 최선의 접근 방법인지는 확실치 않지만 작동합니다. –

답변

1

귀하의 작업 내용에 따라 다릅니다. 당신이 ArgumentListSyntax 따라서 0 개 이상의 ArgumentSyntax ES (ArgumentListSyntax.Arguments)가있는 경우, 당신은 인수 식에서 유형의 정보를 얻을 수 있습니다

var type = model.GetTypeInfo(argument.Expression).Type as INamedTypeSymbol; 

그리고 거기에서

IsGenericType 속성입니다. 예를 들면 :

Debug.Assert(type.IsGenericType); 

을 그리고 당신은 방법의 MethodDeclarationSyntax 객체가있는 경우 ReturnType 속성이 GenericNameSyntax의 유형입니다, 당신은 볼 수 있습니다

Debug.Assert(methodDeclaration.ReturnType is GenericNameSyntax); 

캐스트 GenericNameSyntax에 대한 자세한 정보를 얻을 수는 타입 인자와 같은 일반적인 타입.