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

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

最佳答案

SemanticModels 绑定(bind)到一个底层的 SyntaxTree,因此您只需要确保它们对齐即可。如果你有一个 IEnumerable<SemanticModel>你只需要做:

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

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

坚持使用 SemanticModel 的唯一主要优势是您可以获得一些缓存优势,在此过程中交换内存;不要坚持你不会再使用的语义模型。

关于c# - 如何确定哪个 SemanticModel 实例解析 ExpressionSyntax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12556492/

相关文章:

c# - 序列化 C# 对象,同时维护对象引用

c# - 如何在 Metro 风格应用程序中将值从一个 xaml 页面传递到另一个页面

asp.net-mvc - 升级现有项目以使用 Roslyn 编译器

c# - 使用 .Net 编译器 Roslyn 为 C# 代码创建控制流图

c# - Roslyn:从代码分析器访问部分类的 XAML

c# - C# 交互窗口可以与我的代码交互吗?

c# - winforms应用程序中存储数据库访问密码的位置

c# - 在循环中从哈希表中删除项目

c# - ReSharper 7.1 "To Property with Backing Field"将字段移出位置

c# - 如何自动加载 Roslyn 分析器(无代码修复)