EnumOptions.cs 2.02 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Rcs.Domain.Attributes;

namespace Rcs.Shared.Options
{
    /// <summary>
    /// 枚举下拉选项工具类
    /// 从枚举特性自动生成下拉选项,支持多语言
    /// @author zzy
    /// </summary>
    public static class EnumOptions
    {
        /// <summary>
        /// 支持的语言
        /// </summary>
        public enum Language { ZhCn, En }

        /// <summary>
        /// 下拉选项
        /// </summary>
        public class Option
        {
            public string Label { get; set; } = string.Empty;
            public int Value { get; set; }
        }

        /// <summary>
        /// 获取枚举的下拉选项列表
        /// </summary>
        /// <typeparam name="T">枚举类型</typeparam>
        /// <param name="lang">语言</param>
        /// <returns>下拉选项列表</returns>
        public static List<Option> GetOptions<T>(Language lang = Language.ZhCn) where T : Enum
        {
            return Enum.GetValues(typeof(T))
                .Cast<T>()
                .Select(e => new Option
                {
                    Value = Convert.ToInt32(e),
                    Label = GetDescription(e, lang)
                })
                .ToList();
        }

        /// <summary>
        /// 获取枚举值的描述
        /// </summary>
        private static string GetDescription<T>(T value, Language lang) where T : Enum
        {
            var field = typeof(T).GetField(value.ToString());
            var attr = field?.GetCustomAttribute<EnumDescriptionAttribute>();

            if (attr == null) return value.ToString();

            return lang == Language.En ? attr.En : attr.ZhCn;
        }

        /// <summary>
        /// 解析语言参数
        /// </summary>
        public static Language ParseLanguage(string lang) =>
            lang?.ToLower() switch
            {
                "en" or "en-us" => Language.En,
                _ => Language.ZhCn
            };
    }
}