C#中如何为ResponseBase类的Message属性设置枚举描述默认值
解决方案
要实现当Message未被外部赋值时自动使用ResponseMessage枚举的描述值,可以通过给Message属性添加自定义 getter 逻辑,并配合枚举扩展方法来实现,具体步骤如下:
1. 实现枚举描述扩展方法
先写一个通用的枚举扩展方法,用来提取枚举值的DescriptionAttribute内容(对应你提到的toDescription()方法):
public static class EnumExtensions { public static string ToDescription(this Enum enumValue) { var field = enumValue.GetType().GetField(enumValue.ToString()); var descAttr = field.GetCustomAttributes(typeof(DescriptionAttribute), false) .FirstOrDefault() as DescriptionAttribute; return descAttr?.Description ?? enumValue.ToString(); } }
这个方法会优先读取枚举值上标注的[Description]属性内容,如果没有标注,就返回枚举值的字符串名称。
2. 修改ResponseBase<T>类的Message属性
把Message改为带私有字段的属性,在 getter 中判断是否已被赋值:
using Newtonsoft.Json; using System; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; namespace Logistics.ShippingRoutes.Domain.Models { /// <summary> /// ResponseBase /// </summary> [ExcludeFromCodeCoverage] public class ResponseBase<T> where T : struct, Enum, IConvertible { // 私有字段存储外部赋值的Message内容 private string _backingMessage; public int HttpStatusCode { get; set; } [JsonIgnore] public T ResponseMessage { get; set; } public string Message { get { // 若未被外部赋值,返回ResponseMessage的描述值 return _backingMessage ?? ((Enum)(object)ResponseMessage).ToDescription(); } set { // 外部赋值时直接存储到私有字段 _backingMessage = value; } } } }
逻辑说明
- 私有字段
_backingMessage默认值为null,用来标记是否被外部赋值过 - 当读取
Message时:- 如果
_backingMessage不为null,直接返回外部赋值的内容 - 如果为
null,就把泛型T强制转换为Enum(因为约束已经限定T是枚举),调用扩展方法获取描述值
- 如果
- 后续如果修改了
ResponseMessage的值,只要Message没被赋值,再次读取时会自动返回新枚举值的描述
示例用法
假设你有这样的枚举:
public enum ShippingResponseCode { [Description("请求成功")] Success, [Description("路由不存在")] RouteNotFound, [Description("参数无效")] InvalidParameter }
使用时:
var response = new ResponseBase<ShippingResponseCode> { HttpStatusCode = 404, ResponseMessage = ShippingResponseCode.RouteNotFound }; // 未赋值Message,输出"路由不存在" Console.WriteLine(response.Message); // 手动赋值后,输出自定义内容 response.Message = "无法找到指定的运输路线"; Console.WriteLine(response.Message);
内容的提问来源于stack exchange,提问作者Pavan K
相关产品推荐
相关产品推荐

