如何使用C#获取.resx文件中的注释或描述字段
获取.resx文件中的描述字段(C#)
嘿,我知道你已经能用ResourceManager成功获取.resx里的value字段了,现在想要拿到对应的描述字段对吧?其实ResourceManager本身并没有提供直接获取描述的API——因为描述字段本质是.resx文件里的XML注释属性,默认不会被编译到最终的资源集中。不过我们可以直接解析.resx的XML结构来实现这个需求,下面给你两种实用的方法:
方法一:直接解析源.resx文件(最可靠)
.resx文件本质是符合特定规范的XML文档,每个资源项的描述对应<data>元素的comment属性。我们可以直接读取XML来提取这个值:
public static string GetResourceDescription(string resxFilePath, string key) { // 参数校验 if (string.IsNullOrWhiteSpace(resxFilePath) || string.IsNullOrWhiteSpace(key)) return string.Empty; try { // 加载resx文件 var xDoc = XDocument.Load(resxFilePath); // 注意resx文件的默认命名空间,必须指定正确才能找到节点 XNamespace resxNs = "http://schemas.microsoft.com/developer/msbuild/2003"; // 定位到对应key的<data>元素 var targetData = xDoc.Descendants(resxNs + "data") .FirstOrDefault(data => data.Attribute("name")?.Value == key); // 返回描述字段(如果存在的话) return targetData?.Attribute("comment")?.Value ?? "无描述信息"; } catch (Exception ex) { // 这里可以根据你的需求添加异常处理逻辑 Console.WriteLine($"读取资源描述失败:{ex.Message}"); return string.Empty; } }
使用说明:
- 你需要传入.resx文件的完整路径(比如
@"C:\YourProject\Resources\YourResxFile.resx") - 这个方法直接操作源.resx文件,不需要依赖编译后的程序集,能确保拿到最新的描述信息
方法二:结合现有ResourceManager(仅适用于特殊场景)
如果你的.resx文件在编译时被配置为将描述字段嵌入到资源元数据中(这种情况比较少见),可以尝试用ResourceReader来读取,但需要注意:默认情况下编译后的.resources文件不会包含描述信息,所以这个方法不一定通用。示例代码如下:
public static string GetResourceDescriptionFromAssembly(string resourceName, string key) { var assembly = System.Reflection.Assembly.Load("App_GlobalResources"); using (var stream = assembly.GetManifestResourceStream(resourceName + ".resources")) { if (stream == null) return string.Empty; using (var reader = new System.Resources.ResourceReader(stream)) { foreach (DictionaryEntry entry in reader) { if (entry.Key.ToString() == key) { // 尝试获取描述元数据(仅当编译时嵌入了该信息才有效) reader.GetMetadata(key, out var metadata); return metadata?.ToString() ?? string.Empty; } } } } return string.Empty; }
补充说明
对比下来,方法一是最推荐的方案,因为它直接读取源文件,不受编译配置影响,能稳定获取描述字段。你可以把这个方法和你现有的f_str_textoRecurso方法结合使用,比如同时返回value和描述,或者单独调用获取描述。
内容的提问来源于stack exchange,提问作者krlosruiz




