DisplayAttribute本地化失败:无法获取'Name'属性异常求助
你遇到的这个InvalidOperationException确实有点棘手——明明已经按照常规方案把资源类设为公共、配置了PublicResXFileCodeGenerator,但还是报错。结合你给出的代码细节,我注意到几个容易被忽略的关键点,尤其是你**手动创建了空的SharedResources.cs**这一点,大概率是问题的核心,下面给你逐一排查解决方案:
1. 移除手动创建的空SharedResources.cs,依赖自动生成的Designer类
你手动写的空SharedResources.cs会和PublicResXFileCodeGenerator自动生成的SharedResources.Designer.cs产生类定义冲突。自动生成的Designer类应该包含完整的资源访问逻辑,比如:
namespace Common { public class SharedResources { private static global::System.Resources.ResourceManager resourceManager; private static global::System.Globalization.CultureInfo resourceCulture; public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceManager, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Common.SharedResources", typeof(SharedResources).Assembly); resourceManager = temp; } return resourceManager; } } public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } public static string Common_From { get { return ResourceManager.GetString("Common_From", resourceCulture); } } // 其他资源键对应的静态属性 } }
手动的空类会覆盖或者干扰这个自动生成的类,导致DisplayAttribute找不到对应的公共静态属性。建议直接删除你手动创建的SharedResources.cs,让工具自动生成完整的公共类。
2. 确认资源文件的「自定义工具命名空间」配置
右键类库中的SharedResources.resx → 打开属性面板,检查自定义工具命名空间(Visual Studio中)是否和你ViewModel中引用的命名空间一致。比如你的Common项目默认命名空间是Common,那么这个值也应该设为Common,确保自动生成的SharedResources类在正确的命名空间下,ViewModel里的typeof(SharedResources)才能精准定位到它。
3. 验证类库引用与编译状态
确保ViewModel所在的项目(Web项目或独立ViewModel项目):
- 正确引用了Common类库,不是过时的引用;
- 解决方案已经清理并重新生成过——有时候类库更新后没重新编译,ViewModel项目会引用旧版本的DLL,导致资源属性无法被找到。
4. 直接测试资源访问,排除DisplayAttribute的特殊问题
在ViewModel项目中写一段简单的测试代码,直接访问资源类的静态属性:
var testResource = Common.SharedResources.Common_From;
如果这段代码编译报错或运行时异常,说明问题出在类库的资源配置上(比如命名空间、类访问修饰符);如果能正常获取值,那可以尝试在DisplayAttribute中使用完全限定的命名空间:
[Display(ResourceType = typeof(Common.SharedResources), Name = "Common_From")] public DateTime? FromDate { get; set; }
避免因为命名空间引用缺失导致的类型查找失败。
5. 检查资源键的拼写与大小写
虽然你说替换成普通字符串也报错,但还是要确认SharedResources.resx中确实存在Common_From这个资源键,并且大小写完全匹配——资源键是严格区分大小写的,哪怕一个字母大小写错误,都会导致找不到对应的属性。
内容的提问来源于stack exchange,提问作者Tom

