05/10/2019, 18:30

[C#] Sử dụng Attribute Annotation trong lập trình C# CSharp

Tìm hiểu về Annotation, các tạo ra Attribute và sử dụng Annotation trong ví dụ C# đơn giản, áp dụng Data Annotation để kiểm tra dữ liệu lớp. [C#] Sử dụng Attribute Annotation trong lập trình C# CSharp Khái niệm về Annotation (Attribute) Một chú thích ...

Tìm hiểu về Annotation, các tạo ra Attribute và sử dụng Annotation trong ví dụ C# đơn giản, áp dụng Data Annotation để kiểm tra dữ liệu lớp.

[C#] Sử dụng Attribute Annotation trong lập trình C# CSharp

Khái niệm về Annotation (Attribute)

Một chú thích (Annotation) tác động một thành phần nào đó của chương trình (lớp, phương thức, thuộc tính) nó là một phần của siêu dữ liệu (metadata - loại dữ liệu cung cấp thông tin về dữ liệu khác). Annotation giúp thêm thông tin vào lớp, phương thức, thuộc tính những đoạn code mở rộng. Tính năng này trong Java gọi là Annotation, trong C# gọi là Attribute.

Trong C# có định nghĩa sẵn vô số các Attribute, để sử dụng nó bạn chỉ cần viết tên Attribute trong dấu [] trước đối tượng áp dụng như lớp, phương thức, thuộc tính lớp (có tham số như hàm, nếu Attribute đó yêu cầu).

[AttributeName(param1, param2 ...)]

Ví dụ: trong C# có thuộc tính Obsolete, để đánh dấu một phương thức, lớp ... nào đó là lạc hậu.

using System;

namespace DataAnnotation
{
    public class MyClass {

        [Obsolete("Phương thức này lỗi thời, hãy  dùng phương thức Abc")]  // Đánh dấu phương thức Method1 lạc hậu
        public static void Method1() {
            Console.WriteLine("Phương thức chạy");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyClass.Method1();
        }
    }
}

Kết quả là khi soạn code, hay khi biên dịch sẽ có cảnh báo.

attrbute_csharp

Tự tạo Attribute C#

Để tạo Attribute riêng khá đơn giản, bạn chỉ việc tạo một lớp kế thừ từ System.Attribute. Tuy nhiên để sử dụng được trước tiên cần thành thạo kỹ thuật Reflection trong C#. Ở mức độ đơn giản, hãy tìm hiểu và sử dụng Type tại Đọc thuộc tính lớp với Type .

Giờ thử thực hành tạo một Attribute riêng đặt tên là MotaAttribute, thuộc tính này để bạn thêm thông tin mô tả nào đó (string) cho thành phần áp dụng (như lớp, thuộc tính, phương thức)

using System;
namespace DataAnnotation.Attributes
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Method)]
    public class MotaAttribute : Attribute // có thể đặt tên Mota thay cho MotaAttribute
    {
        public MotaAttribute(string v) => Description = v;

        public string Description {set; get;}
    }
}

Trong định nghĩa trên, AttributeUsage() là để thiết lập thuộc tính Mota áp dụng được cho những thành phần nào, như có AttributeTargets.Property nghĩa là được phép áp dụng cho các thuộc tính lớp.

Như vậy bạn đã tạo được một thuộc tính Mota, áp dụng cho đối tượng nào thì chỉ cần viết

[Mota("mô tả gì đó")]

Áp dụng Attribute Mota

using System;
using DataAnnotation.Attributes;

namespace DataAnnotation
{

    [Mota("Lớp biểu diễn người dùng")]                  // thêm Attribute cho lớp
    public class User
    {
        [Mota("Thuộc tính lưu tuổi")]                   // thêm Attribute cho thuộc tính lớp
        public int age {set; get;}

        [Mota("Phương thức này hiện thị age")]          // thêm Attribute cho phương thức
        public void ShowAge()
        {
        }
    }

    class Program
    {
       static void Main(string[] args)
        {
            var a = new User();

            // Đọc các Attribute của lớp
            foreach (Attribute attr in a.GetType().GetCustomAttributes(false))
            {
                MotaAttribute mota =  attr as MotaAttribute;
                if (mota != null)
                {
                    Console.WriteLine($"{a.GetType().Name,10} : {mota.Description}");
                }
            }

            // Đọc Attribute của từng thuộc tính lớp
            foreach (var thuoctinh in a.GetType().GetProperties())
            {
                foreach (Attribute attr in thuoctinh.GetCustomAttributes(false))
                {
                    MotaAttribute mota =  attr as MotaAttribute;
                    if (mota != null)
                    {
                        Console.WriteLine($"{thuoctinh.Name,10} : {mota.Description}");
                    }
                }
            }

            // Đọc Attribute của phương thức
            foreach (var m in a.GetType().GetMethods())
            {
                foreach (Attribute attr in m.GetCustomAttributes(false))
                {
                    MotaAttribute mota =  attr as MotaAttribute;
                    if (mota != null)
                    {
                        Console.WriteLine($"{m.Name,10} : {mota.Description}");
                    }
                }
            }

        }
    }
}

Data Annotation trong C#

Các Data Annotation trong C# định nghĩa trong namespace System.ComponentModel.DataAnnotations, có các loại gồm:

  • Các Attribute để kiểm tra dữ liệu (Validation Attribute)
  • Các Attribute hiện thị (Display Attribute), điều khiển dữ liệu trong lớp hiện thị thế nào trong UI
  • Modelling Attribute

Hãy thử xem một vài Attribute:

Required Dữ liệu phải được thiết lập (!=null)
[Required (ErrorMessage="{0} cần thiết lập")]
StringLength Thiết lập độ dài trường dữ liệu
[StringLength (20,MinimumLength=3, ErrorMessage="Phải dài 3 đến 20 ký tự")]
DataType Chỉ ra dữ liệu phải liên kết phù hợp với một kiểu nào đó
[DataType(DataType.Text)]
[DataType(DataType.PhoneNumber)]
[DataType(DataType.EmailAddress)]
/.. Date, DateTime, Html, ImageUrl, MultilineText, Password, Time, Url
Range Chỉ ra dữ liệu phải trong khoảng nào đó
[Range(18,99, ErrorMessage="Tuổi từ 18 đến 99")]
[Range(typeof(DateTime), "1/2/2004", "3/4/2004",
        ErrorMessage = "Value for {0} must be between {1} and {2}")]
Phone [Phone] dữ liệu phải là dạng số điện thoại
EmailAddress [EmailAddress] dữ liệu phải là dạng email

Thanks for watching!

Laptrinhvb via xuanthulab

Tags: attribute annotation c#
0