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:
- 遍历每个razor文件,扫描文件内需要翻译的文本标识(比如自定义的多语言标记、硬编码文本内容),生成二级键值对
- 将配置键作为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
相关产品推荐
相关产品推荐

