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

.NET Core 3.1中如何正确寻址RESX文件以反向获取资源键

在.NET Core 3.1中通过RESX值反查键名的正确方式

我来帮你搞定这个问题~你遇到的核心问题是ResourceManager构造时的资源名称参数写错了,另外.NET Core里访问RESX还有更简洁的方式,下面一步步给你讲清楚:

一、先纠正ResourceManager的寻址错误

你写的"Resources.Views.Shared._Layout.de.resx"是错误的,原因有两点:

  • 不需要带.resx后缀,也不需要带文化代码(比如.de),ResourceManager会自动根据当前文化加载对应的卫星资源文件
  • 正确的名称应该是资源的完整命名空间+基础文件名,比如你的项目命名空间是MyAspNetCoreApp,资源文件放在Resources/Views/Shared/_Layout.resx,那么完整名称就是MyAspNetCoreApp.Resources.Views.Shared._Layout

二、推荐使用自动生成的资源类(更简单不易错)

当你在Visual Studio里添加RESX文件时,默认会自动生成对应的C#类,步骤如下:

  1. 选中你的RESX文件(比如_Layout.resx),在属性面板里确认:
    • 自定义工具设为ResXFileCodeGenerator
    • 访问修饰符设为public(这样才能在其他类里访问)
  2. 此时会生成一个和RESX同名的类(比如_Layout),直接通过这个类来获取ResourceManager即可

示例代码(用自动生成的类)

using System.Globalization;
using System.Resources;
using System.Collections;

public async Task<string> GetKeyFromValue(string targetValue)
{
    // 这里的_Layout是自动生成的资源类,替换成你实际的类名
    ResourceManager rm = _Layout.ResourceManager;
    ResourceSet resourceSet = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true);
    
    return await Task.Run(() => 
    {
        DictionaryEntry entry = resourceSet.OfType<DictionaryEntry>()
                                           .FirstOrDefault(e => e.Value.ToString() == targetValue);
        return entry?.Key.ToString();
    });
}

三、手动实例化ResourceManager的正确写法

如果你不想用自动生成的类,也可以手动实例化,但一定要注意命名空间的正确性:

using System.Globalization;
using System.Resources;
using System.Collections;

public async Task<string> GetKeyFromValue(string targetValue)
{
    // 替换成你的项目命名空间+资源路径,比如"MyAspNetCoreApp.Resources.Views.Shared._Layout"
    string resourceName = "YourProjectNamespace.Resources.Views.Shared._Layout";
    ResourceManager rm = new ResourceManager(resourceName, typeof(YourCurrentClass).Assembly);
    ResourceSet resourceSet = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true);
    
    return await Task.Run(() => 
    {
        DictionaryEntry entry = resourceSet.OfType<DictionaryEntry>()
                                           .FirstOrDefault(e => e.Value.ToString() == targetValue);
        return entry?.Key.ToString();
    });
}

四、额外注意事项

  • 文化获取:在ASP.NET Core里,更推荐用CultureInfo.CurrentCulture或者从HttpContext.Request.HttpContext.Features.Get<IRequestCultureFeature>().RequestCulture.Culture获取当前文化,而不是Thread.CurrentThread.CurrentCulture(虽然也兼容,但前者更符合.NET Core的设计)
  • 重复值处理:如果RESX里有多个键对应同一个值,FirstOrDefault只会返回第一个匹配的键,这点要提前考虑
  • 资源嵌入:确保RESX文件的生成操作设为嵌入的资源,否则ResourceManager会找不到资源

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:12:48