自定义枚举特性

        新增一个枚举扩展类

/// <summary>
/// 枚举扩展特性
/// </summary>
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)]
public class ApiEnum : Attribute
{
  private string _code;

  private string _msg;

  public string Code
  {
    get { return _code; }
    set { _code = value; }
  }

  public string Message
  {
    get { return _msg; }
    set { _msg = value; }
  }
  /// <summary>
  /// 枚举特性
  /// </summary>
  /// <param name="code">消息码</param>
  /// <param name="msg">枚举消息描述</param>
  public ApiEnum(string code,string msg)
  {
    this._code = code;
    this._msg = msg;
  }

  /// <summary>
  /// 获取枚举消息码
  /// </summary>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static string GetCode(Enum obj)
  {
    var fAttrs = GetFieldInfo(obj);
    return fAttrs.Length > 0 ? ((ApiEnum)fAttrs[0]).Code : string.Empty;
  }
  /// <summary>
  /// 获取枚举消息描述
  /// </summary>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static string GetMessage(Enum obj)
  {
    var fAttrs = GetFieldInfo(obj);
    return fAttrs.Length > 0 ? ((ApiEnum)fAttrs[0]).Message : string.Empty;
  }

  private static object[] GetFieldInfo(Enum obj)
  {
    var type = obj.GetType();
    var fieldName = Enum.GetName(type, obj);
    return type.GetField(fieldName).GetCustomAttributes(typeof(ApiEnum), false);
  }

  在枚举中这么使用:

/// <summary>
/// api响应报文枚举
/// </summary>
public enum ApiRespCode
{
    [ApiEnum("000000","response succeed.")]
    S000000,
    [ApiEnum("400000","请求参数验证失败:{0}")]
    F400000,
    [ApiEnum("999999","system error.")]
    E999999
}

  当然,枚举code和message使用英文和中文描述,用户体验会更好。

  获取枚举code或者message的用法:

public ApiException(ApiRespCode apiRespCode) : base(ApiEnum.GetMessage(apiRespCode)) { }

 

posted @ 2019-10-16 16:26  原来是李  阅读(305)  评论(0编辑  收藏  举报