2017-04-04 15 views
0

タイトルで述べたように、メソッドの戻り値の型がジェネリックである場合、メソッドparamsがジェネリックであるかどうかをチェックしたいと思います。例えば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

いいえ - パラメータ/戻り値が汎用であるかどうかを知りたいだけです。例えば、以下のメソッドの場合: 'public static TValue GetOrDefault (TKeyキー)' 'key'パラメタが一般的で、戻り値' TValue'も総称であるかどうかを知りたいと思います。 –

+0

これで、 'ITypeSymbol.TypeKind'にアクセスして私が探しているものを見つけることができました。それが最良のアプローチであるかどうかは分かりませんが、機能します。 –

答えて

1

これは、作業する必要があるかどうかによって異なります。

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

そしてそこから、IsGenericTypeプロパティ:あなたはArgumentListSyntaxので、ゼロ以上ArgumentSyntax ES(ArgumentListSyntax.Arguments)をお持ちの場合は、引数式から型情報を取得することができます。たとえば、次のように

Debug.Assert(type.IsGenericType); 

そして、あなたは方法のMethodDeclarationSyntaxオブジェクトを持っている場合ReturnTypeプロパティはGenericNameSyntaxのタイプであれば、あなたが見ることができます:

に関する詳細な情報を取得するために GenericNameSyntaxにキャスト
Debug.Assert(methodDeclaration.ReturnType is GenericNameSyntax); 

型引数のようなジェネリック型。