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

如何获取类声明对应的.cs源文件路径

实现方案

以下提供两种适配不同场景的实现方式,你可以根据自己的使用需求选择:


场景1:程序运行时获取(依赖PDB调试信息,适合开发环境内部工具使用)

如果你的主程序和目标类在同一解决方案内,且运行环境带完整PDB调试文件,可以通过StackTrace直接获取类构造函数对应的源文件路径,代码示例:

using System.Diagnostics;
using System.Reflection;

// 传入Type类型的实现
public static string GetPathOfType(Type type)
{
    ConstructorInfo ctor = type.GetConstructors().FirstOrDefault();
    if (ctor == null)
        return null;
    
    StackTrace st = new StackTrace(ctor, true);
    StackFrame frame = st.GetFrame(0);
    return frame?.GetFileName();
}

// 传入类名字符串的重载
public static string GetPathOfType(string className, Assembly targetAssembly = null)
{
    Assembly assembly = targetAssembly ?? Assembly.GetExecutingAssembly();
    Type type = assembly.GetTypes().FirstOrDefault(t => t.Name == className || t.FullName == className);
    return type == null ? null : GetPathOfType(type);
}

注意事项:

  • 要求目标项目编译时开启调试信息生成(Debug模式默认开启,Release模式可在项目属性→生成→高级中设置生成PDB文件)
  • 仅能获取已加载到运行时的类型路径,不适合发布后的生产环境使用

场景2:直接扫描项目源码(不依赖编译运行,完全适配你的源文件管理需求)

如果你的主程序是独立的源码管理脚本,不需要运行目标项目,直接遍历项目目录下所有.cs文件匹配类名即可,这种方式更适配你感知文件移动、操作源文件的需求,代码示例:

using System.IO;
using System.Text.RegularExpressions;

public static string GetPathOfTypeFromSource(string className, string projectRootPath)
{
    // 递归遍历项目下所有C#源文件
    var allCsFiles = Directory.EnumerateFiles(projectRootPath, "*.cs", SearchOption.AllDirectories);
    // 匹配类声明的正则,支持class/record/struct、partial类、不同访问修饰符的场景
    var classRegex = new Regex($@"\b(class|record|struct)\s+{Regex.Escape(className)}\b", RegexOptions.Multiline);
    
    foreach (var file in allCsFiles)
    {
        string content = File.ReadAllText(file);
        if (classRegex.IsMatch(content))
        {
            return file;
        }
    }
    return null;
}

对应你的伪代码调用样例:

string currentFilePath = "Project/Example/ExampleClass1.cs";
string className = "ExampleClass1";
string projectRoot = "你的本地项目根目录路径";

if (!File.Exists(currentFilePath)) 
{
    string newPath = GetPathOfTypeFromSource(className, projectRoot);
    if (!string.IsNullOrEmpty(newPath))
    {
        // 此处更新你存储的源文件路径列表即可
        currentFilePath = newPath;
    }
}

注意事项:

  • 不需要目标项目编译,直接操作原始源码,适配文件删除、移动等操作场景
  • 如果项目存在同名类,可以在正则中补充命名空间匹配逻辑提高准确率
  • 可以提前缓存所有.cs文件的类名与路径映射关系,避免每次调用都全量扫描,提升运行效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:24:05