要查找ExpressionSyntax实例的目标,请调用mySemanticModel.GetSymbolInfo(myExpressionSyntax).
我有几个SemanticModel实例,每个实例都与代码文件的语法树相关。

我想迭代语义模型并找到合适的模型来返回符号信息,但是我看不到如何在不使用异常的情况下测试合适的语义模型。

我需要完成以下代码:

SymbolInfo? Resolve(ExpressionSyntax expressionSyntax)
{
    foreach (SemanticModel semanticModel in allSemanticModels)
    {
        if ( /* test if expression syntax found in semantic model */ )
        {
            return semanticModel.GetSymbolInfo(expressionSyntax);
        }
    }
    return null;
}

最佳答案

SemanticModels绑定到底层的SyntaxTree,因此您只需要确保将它们对齐即可。如果您有IEnumerable<SemanticModel>,则只需执行以下操作:

var model = models.First(m => m.SyntaxTree == expressionSyntax.SyntaxTree);


挑选合适的;您最好使用Dictionary<SyntaxTree, SemanticModel>,而不是每次都列举一个列表。我不确定为什么您要使用任何其他数据结构来保存它们。

坚持使用SemanticModel的唯一主要优点是,您可以获得一些缓存好处,可以在此过程中交换内存。不要持有不再要使用的SemanticModels。

08-06 19:00