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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:23:15