CÔNG NGHỆ THÔNG TIN >> BÀI VIẾT CHỌN LỌC

Thêm Description Attribute cho từng Enum và chuyển đổi Enum thành một List Item trong .NET

Đăng lúc: 05:33 PM - 08/12/2023 bởi Charles Chung - 756

Hướng dẫn Add Description Attribute cho từng Enum và Convert Enum to List of Item trong C# .NET

Giới thiệu

Enum là từ khoá dùng để khai báo một kiểu liệt kê (Enumeration). Kiểu liệt kê là một tập hợp các hằng số do người dùng tự định nghĩa. Nói cách khác, enum là cách mà C# hỗ trợ người dùng gom nhóm các hằng số lại với nhau và có chung một tên gọi.

Trong bài viết này tôi sẽ hướng dẫn các bạn định nghĩa một Enum với nhiều các hằng số, đồng thời sử dụng Attribute Description để mô tả tiếng việt cho từng hằng số. Cuối cùng sẽ hướng dẫn các bạn chuyển một Enum với các Attribute Description thành một List các Item, điều này thuận tiện cho việc hiển thị các hằng số cho người dùng lựa chọn trên nền tảng giao diện Web hoặc Desktop.

Kiến thức cần có

  • C# Căn bản
  • Attribute trong C#
  • Reflection trong C#

Tạo ứng dụng Console C# 

  • Tạo project với tên "EnumUtil" có cấu trúc như hình dưới

  • Tạo lớp Item.cs (biểu diễn thông tin của một phần tử trong Enum)
1
2
3
4
5
6
7
8
9
/// <summary>
    /// Lớp item gồm 3 thông tin Id, Name và Description
    /// </summary>
    public class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }
  • Tạo lớp EnumExtension.cs (gồm các nghiệp vụ lấy Attribute, convert to List)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 public static class EnumExtension
    {
        /// <summary>
        /// Phương thức trả về thuộc tính (Attribute) của 1 phần tử trong Enum
        /// </summary>
        /// <typeparam name="T">Kiểu thuộc tính</typeparam>
        /// <param name="value">Biến enum</param>
        /// <returns>Thuộc tính của phần tử</returns>
        static T GetAttribute<T>(this Enum value) where T : Attribute
        {
            var type=value.GetType();
            var memberInfor = type.GetMember(value.ToString());
            var attributes = memberInfor[0].GetCustomAttributes(typeof(T), false);
            return (T)attributes[0];
        }
        /// <summary>
        /// Phương thức lấy giá trị thuộc tính Description của phần tử trong Enum
        /// </summary>
        /// <param name="value">Biến enum</param>
        /// <returns>Trả về giá trị của thuộc tính Description, nếu attribute null thì trả về tên của phần tử trong Enum</returns>
        public static string ToDescription(this Enum value)
        {
            var attribute = value.GetAttribute<DescriptionAttribute>();
            return attribute == null ? value.ToString() : attribute.Description;
        }
        /// <summary>
        /// Phương thức chuyên 1 Enum sang dạng List Item
        /// </summary>
        /// <typeparam name="T">Kiểu Enum</typeparam>
        /// <returns>Danh sách kiểu Item</returns>
        public static List<Item> ToList<T>()
        {
            List<Item> items = Enum.GetValues(typeof(T)).Cast<Enum>().Select((e,index) => new Item {Id=index, Name=e.ToString(),Description= e.ToDescription() }).ToList();
            return items;
        }
    }
  • Mở lớp Program.cs ra và code sau để test
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 enum OrderStatus
    {
        [Description("Chờ xác nhận")]
        WaitCommit,
        [Description("Đã xác nhận")]
        Commited,
        [Description("Chờ lấy hàng")]
        Preparing,
        [Description("Đang giao hàng")]
        Delivering,
        [Description("Giao hàng thành công")]
        Success,
        [Description("Hủy")]
        Cancel
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;
            //Chuyển đổi
            List<Item> items = EnumExtension.ToList<OrderStatus>();
            Console.WriteLine("-----Thông tin của từng phần tử------");
            foreach (Item item in items)
            {
                Console.WriteLine(item.Id+":"+item.Name+":"+item.Description);
            }
            //in ra mô tả của 1 phần tử
            Console.WriteLine("-----Thông tin của phần tử success------");
            var status=OrderStatus.Success;
            Console.WriteLine((int)status+":"+ status+":"+status.ToDescription());
        }
    }
  • Nhấn Ctrl+F5 để chạy và xem kết quả

 

Link tải source code

thay lời cảm ơn!

QUẢNG CÁO - TIẾP THỊ