在Roslyn中如何检查方法参数类型/返回类型是否是通用的?

时间:2017-04-04 14:29:40

标签: c# .net generics code-analysis roslyn

正如标题中所述,我想检查方法参数是否是通用的+如果方法的返回类型是通用的。

例如:

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

在这里,我想返回method变量的所有类型的参数,这些参数不是通用的,但我无法在API中找到任何内容来过滤结果。

在检查方法的返回类型是否通用时,我遇到了同样的问题。

1 个答案:

答案 0 :(得分:1)

这取决于您必须使用的内容。如果您有ArgumentListSyntax因此零{或} {es} ArgumentSyntax,则可以从参数表达式中获取类型信息:

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); 以获取有关类型参数等泛型类型的更多信息。