.NET 5下Microsoft.OpenApi.Extensions.GetDisplayName失效 复制代码可用
问题的常见原因如下:
- 枚举类型的访问修饰符限制
Microsoft.OpenApi.Extensions内置的GetAttributeOfType方法在调用特性读取接口时,默认仅扫描public级别成员上的特性。如果你的枚举定义为internal、private等非公开级别,该扩展方法无法读取到附加的[Display]特性,只会返回枚举值的字符串形式。你自行拷贝到项目中的代码在读取特性时默认开启了非公开成员的扫描权限,因此可以正常读取。 - 依赖包版本兼容性问题
部分低版本的Microsoft.OpenApi包存在已知BUG,EnumExtensions.GetDisplayName内部的特性读取逻辑存在缺陷,无法正确识别System.ComponentModel.DataAnnotations.DisplayAttribute,只会返回枚举ToString结果。你可以尝试将Microsoft.OpenApi包升级到最新稳定版验证问题是否复现。 - Display特性命名空间不匹配
确认你枚举上添加的[Display]特性来自System.ComponentModel.DataAnnotations命名空间,不要和其他第三方类库中的同名Display特性混淆,微软官方的这个扩展方法仅支持该命名空间下的Display特性。 - 本地化配置异常
部分版本的Microsoft.OpenApi.Extensions.EnumExtensions.GetDisplayName内部会调用DisplayAttribute.GetName()方法读取显示值,如果你给[Display]特性设置了ResourceType参数用于本地化,但对应的资源配置不正确,GetName()会返回null,最终方法返回枚举ToString结果。你自行拷贝的代码直接读取Name属性,不受本地化配置错误影响,可以正常拿到你设置的原始字符串。
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

