如何在使用Roslyn时验证方法中参数的类型

时间:2015-03-24 19:15:19

标签: c# code-analysis roslyn

我正在使用Roslyn进行代码分析,以便验证即使我有以下签名

public void MyMethod(object anObject, MyCustomObject customObject);

我只想接收来自MyCustomObject(2nd)的字符串(1st)和子节点作为参数。我对签名没有权力,也无法改变。

以下是我评估我的方法所做的工作(这是一个片段)

    public void OnMethodInvocation(SyntaxNodeAnalysisContext context)
    {
        var invocation= context.Node as InvocationExpressionSyntax;
        var symbol = context.SemanticModel.GetSymbolInfo(invocation).Symbol as IMethodSymbol;

        if (symbol?.Name.ToString()== "MyMethod")
        {
            var parameterList = invocation.Parameters;
        }

截至目前,我可以从属性Parameters(symbol.Parameters)中操作我的IParameterSymbol对象。我没有得到的是以下内容:我已经完成了包含我的参数的结果IEnumerable,但由于方法签名,它希望接收一个对象和一个MyCustomObject实例。我不是在某个位置(目前)确定第一个参数确实是一个对象而不是一个字符串(仅仅是一个例子,可能是其他任何东西)并且当我期待一个MyCustomObject的子节点时,如果我给它一个null,我想知道它是一个空参数。

我会感激任何能阻止我摆脱困境的人!

更新

当我进入ArgumentSyntax对象时,这是给我什么样的信息:

ArgumentSyntax Argument exception
    ContainsAnnotations: false
    ContainsDiagnostics: false
    ContainsDirectives: false
    ContainsSkippedText: false
    Expression: IdentifierNameSyntax IdentifierName exception
    FullSpan: {[550..559)}
    HasLeadingTrivia: false
    HasStructuredTrivia: false
    HasTrailingTrivia: false
    IsMissing: false
    IsStructuredTrivia: false
    KindText: "Argument"
    Language: "C#"
    NameColon: null
    Parent (Microsoft.CodeAnalysis.SyntaxNode): ArgumentListSyntax ArgumentList (exception,exception)
    ParentTrivia: SyntaxTrivia None 
    RawKind: 8638
    RefOrOutKeyword: SyntaxToken None 
    Span: {[550..559)}
    SpanStart: 550

1 个答案:

答案 0 :(得分:2)

你应该做的是获取参数(不是参数 - 它们是不同的东西!)并在ArgumentSyntax上调用SemanticModel.GetTypeInfo()。那将给你传递的表达式的类型。从那里你可以做任何你需要的检查。