.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#类,步骤如下:
- 选中你的RESX文件(比如
_Layout.resx),在属性面板里确认:- 自定义工具设为
ResXFileCodeGenerator - 访问修饰符设为
public(这样才能在其他类里访问)
- 自定义工具设为
- 此时会生成一个和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
相关产品推荐
相关产品推荐

