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

标签 c# code-analysis roslyn

我正在使用 Roslyn 进行代码分析以验证这一点,即使我具有以下签名也是如此

public void MyMethod(object anObject, MyCustomObject customObject);

我只想接收一个字符串(第一个)和一个来自 MyCustomObject 的子对象(第二个)作为参数。我对签名无权控制,无法更改。

这是我为评估我的方法所做的(这是一个片段)

    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;
        }

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

最佳答案

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

关于c# - 使用 Roslyn 时如何验证方法中的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29241013/

相关文章:

c# - 未创建控制台应用程序的设置文件

c# - 为什么空委托(delegate)事件处理程序会导致 CA1061 警告?

vb.net - 任何工具来检查重复的 VB.NET 代码?

c# - 如何调试 Roslyn 编译生成的 dll?

c# - 仅在“编辑并继续”中出现错误 CS7038(无法发出模块)

c# - 获取 cshtml 文件的语义模型?

c# - 记录器包装器最佳实践

c# - 协方差和 orderby() 问题

c# - 如果 ETag 不匹配(除非是 *),如何使用 ETag 在插入时抛出异常

code-coverage - SAP - 代码覆盖率分析器结果