Cách lặp lại các phần tử của Enum từ mã X++ trong Dynamics AX 2012
Đã xuất bản: lúc 23:11:10 UTC 15 tháng 2, 2025
Bài viết này giải thích cách liệt kê và lặp qua các phần tử của một enum cơ sở trong Dynamics AX 2012, bao gồm ví dụ mã X++.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Thông tin trong bài đăng này dựa trên Dynamics AX 2012 R3. Thông tin này có thể đúng hoặc không đúng với các phiên bản khác.
Gần đây tôi đã tạo một biểu mẫu cần hiển thị giá trị cho mỗi phần tử trong enum. Thay vì tạo thủ công các trường (và sau đó cần duy trì biểu mẫu nếu enum bị sửa đổi), tôi quyết định triển khai biểu mẫu một cách động để tự động thêm các trường vào thiết kế khi chạy.
Tuy nhiên, tôi sớm phát hiện ra rằng việc lặp lại các giá trị trong một enum, tuy khá dễ khi bạn đã biết cách, nhưng lại có phần khó hiểu.
Rõ ràng là bạn cần bắt đầu với lớp DictEnum. Như bạn sẽ thấy, lớp này có một số phương pháp để lấy thông tin như tên và nhãn từ cả chỉ mục và giá trị.
Sự khác biệt giữa index và value là index là số của một phần tử trong enum, nếu các phần tử của enum được đánh số tuần tự bắt đầu từ số không, trong khi value là thuộc tính "giá trị" thực tế của phần tử. Vì hầu hết các enum đều có giá trị được đánh số tuần tự từ 0, index và value của một phần tử thường sẽ giống nhau, nhưng chắc chắn không phải lúc nào cũng vậy .
Nhưng làm sao bạn biết được enum có những giá trị nào? Đây chính là lúc mọi thứ trở nên khó hiểu. Lớp DictEnum có một phương thức gọi là values(). Bạn có thể mong đợi phương thức này trả về một danh sách các giá trị của enum, nhưng rõ ràng là điều đó quá dễ, vì vậy thay vào đó, nó trả về số lượng giá trị mà enum chứa. Tuy nhiên, số lượng giá trị không liên quan gì đến các giá trị thực tế, vì vậy bạn cần sử dụng số này làm cơ sở để gọi các phương thức dựa trên chỉ mục, chứ không phải các phương thức dựa trên giá trị.
Giá như họ đặt tên phương thức này là indexes() thì sẽ đỡ gây nhầm lẫn hơn ;-)
Ngoài ra, hãy nhớ rằng các giá trị enum (và rõ ràng là các "chỉ mục" này) bắt đầu từ 0, không giống như các chỉ mục mảng và vùng chứa trong X++, bắt đầu từ 1, do đó, để lặp qua các phần tử trong enum, bạn có thể làm như sau:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Lệnh này sẽ xuất ký hiệu và nhãn của từng phần tử trong enum vào infolog.