You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动