如何确定哪个SemanticModel实例解析ExpressionSyntax

时间:2012-09-23 21:38:17

标签: c# roslyn

要查找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;
}

1 个答案:

答案 0 :(得分:4)

SemanticModels绑定到底层的SyntaxTree,因此您只需确保这些排列。如果您有IEnumerable<SemanticModel>,则必须执行以下操作:

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

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

持有SemanticModel的唯一主要优势是你可以获得一些缓存优势,在此过程中交换内存;不要抓住你不会再使用的SemanticModels了。