You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Microsoft.CodeAnalysis查找类默认构造函数引用及实例化位置

如何获取自动实现构造函数的符号并查找类实例化位置?

你遇到的问题本质是:编译器自动生成的默认构造函数不会出现在语法树中,所以你通过遍历语法节点(ChildNodes())的方式自然找不到它。下面给你具体的解决方案:

一、获取隐式构造函数的符号

不要从语法节点入手,而是直接从语义模型的INamedTypeSymbol类符号来获取构造函数——它的Constructors属性会包含所有构造函数,包括编译器隐式生成的默认构造函数。

示例代码:

// 假设dependant是你拿到的INamedTypeSymbol类型的类符号
var allConstructors = dependant.Constructors;
// 可以单独筛选出编译器自动生成的构造函数
var implicitCtors = allConstructors.Where(c => c.IsImplicitlyDeclared);

这里的IsImplicitlyDeclared属性就是用来判断该符号是不是编译器隐式生成的(比如默认构造函数、自动属性的幕后字段等)。

二、查找类的所有实例化位置

你当前用的SymbolFinder.FindReferencesAsync是可行的,但不用绕弯子找构造函数的引用,有两种更直接的方式:

方式1:通过构造函数符号查找引用

既然我们能拿到包括默认构造函数在内的所有构造函数符号,直接遍历这些构造函数,调用FindReferencesAsync就能获取所有实例化的引用:

var solution = // 你的Solution实例
foreach (var ctor in dependant.Constructors)
{
    var references = await SymbolFinder.FindReferencesAsync(ctor, solution);
    // 处理每个引用的位置
    foreach (var reference in references)
    {
        foreach (var loc in reference.Locations)
        {
            // loc.Location就是实例化的位置信息
        }
    }
}

方式2:直接查找类符号的引用,筛选实例化节点

如果不想处理构造函数,也可以直接查找类本身的所有引用,然后在语法节点中判断是不是实例化操作(比如C#的ObjectCreationExpressionSyntax、VB的ObjectCreationSyntax):

var classSymbol = // 你的INamedTypeSymbol
var references = await SymbolFinder.FindReferencesAsync(classSymbol, solution);

foreach (var reference in references)
{
    foreach (var loc in reference.Locations)
    {
        var syntaxRoot = await loc.Document.GetSyntaxRootAsync();
        var targetNode = syntaxRoot.FindNode(loc.Location.SourceSpan);
        
        // C#实例化判断
        if (targetNode is ObjectCreationExpressionSyntax objCreation)
        {
            // objCreation就是实例化的语法节点,可获取位置等信息
        }
        // VB实例化判断
        else if (targetNode is Microsoft.CodeAnalysis.VisualBasic.Syntax.ObjectCreationSyntax vbObjCreation)
        {
            // 处理VB的实例化节点
        }
    }
}

为什么你的原代码不行?

你原代码是从DeclaringSyntaxReferences拿到语法节点后遍历子节点,但默认构造函数是编译器在编译阶段生成的,没有对应的源代码语法节点,所以自然找不到任何匹配的节点。而语义模型的符号是编译器分析后的结果,会包含这些隐式生成的元素。

内容的提问来源于stack exchange,提问作者Marie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:19:20