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

C# 如何在TreeView中映射外部项目的.razor文件并支持反射处理?

解决方案

1. 加载.razor文件信息

根据你要加载的是未编译的源码项目,还是已编译的Blazor程序集,分为两种实现方式:

1.1 加载外部源码项目(无需反射)

直接遍历项目根目录筛选后缀为.razor的文件,同时保留相对路径作为后续JSON配置的键前缀:

// 填写外部项目的根目录路径
string projectRoot = @"C:\path\to\your\external\project";
var razorFileList = Directory.EnumerateFiles(projectRoot, "*.razor", SearchOption.AllDirectories)
    .Select(fullFilePath => 
    {
        // 生成相对于项目根目录的路径,替换分隔符为统一斜杠、去掉文件后缀
        string relativePath = Path.GetRelativePath(projectRoot, fullFilePath)
            .Replace(Path.DirectorySeparatorChar, '/')
            .Replace(".razor", string.Empty);
        return new 
        {
            FileFullPath = fullFilePath,
            ConfigKey = relativePath
        };
    })
    .ToList();

拿到的列表可直接按路径层级拆分,递归绑定到TreeView控件展示。

1.2 加载已编译Blazor程序集(反射实现)

如果需要读取已编译发布的程序集内的razor文件,可以通过反射读取嵌入式资源实现:

// 填写外部项目编译后的dll路径
string assemblyPath = @"C:\path\to\published\Project.dll";
Assembly targetAssembly = Assembly.LoadFrom(assemblyPath);
// Blazor编译后会把razor文件作为嵌入式资源存储,筛选后缀匹配的资源
List<string> razorResourceNames = targetAssembly.GetManifestResourceNames()
    .Where(resName => resName.EndsWith(".razor"))
    .ToList();

// 解析资源名得到相对路径:资源名格式一般为 项目根命名空间.目录层级.文件名.razor,替换.为/、去掉后缀即可
List<string> configKeys = razorResourceNames
    .Select(resName => resName
        .Replace(".razor", string.Empty)
        .Replace(targetAssembly.GetName().Name + ".", string.Empty)
        .Replace('.', '/'))
    .ToList();

2. 生成多语言JSON配置

拿到所有razor文件对应的配置键后,即可按需求生成多语言JSON:

  1. 遍历每个razor文件,扫描文件内需要翻译的文本标识(比如自定义的多语言标记、硬编码文本内容),生成二级键值对
  2. 将配置键作为JSON的一级键,二级键值对作为对应的值,序列化输出即可
// 示例构造多语言字典
var langConfig = new Dictionary<string, Dictionary<string, string>>();
foreach (var file in razorFileList)
{
    // 此处替换为实际扫描razor文件得到的翻译键值对
    langConfig[file.ConfigKey] = new Dictionary<string, string>
    {
        // 示例占位符,实际从文件内容提取
        { "title", string.Empty },
        { "cases", string.Empty }
    };
}

// 序列化输出带缩进的JSON
string jsonOutput = System.Text.Json.JsonSerializer.Serialize(langConfig, new System.Text.Json.JsonSerializerOptions
{
    WriteIndented = true,
    Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
});
File.WriteAllText(@"C:\path\to\output\lang.json", jsonOutput);

3. TreeView绑定实现

将文件的相对路径按/拆分后递归生成Tree节点即可,根节点对应项目名称,子节点对应目录或razor文件,可自行过滤仅展示.razor文件节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 09:45:03