Lưu ý
Cần có ủy quyền mới truy nhập được vào trang này. Bạn có thể thử đăng nhập hoặc thay đổi thư mục.
Cần có ủy quyền mới truy nhập được vào trang này. Bạn có thể thử thay đổi thư mục.
Lưu ý
Các nhóm quan tâm cộng đồng hiện đã chuyển từ Yammer sang Microsoft Viva Engage. Để tham gia cộng đồng Viva Engage và tham gia vào các cuộc thảo luận mới nhất, hãy điền vào biểu mẫu Tạo nhiệm vụ truy nhập vào biểu mẫu Tài chính và Vận hành Viva Engage Cộng đồng và chọn cộng đồng bạn muốn tham gia.
Bài viết này mô tả cách sử dụng các thuộc tính trong X++.
Thuộc tính là một lớp không liên quan mở rộng (thừa kế từ) lớp SysAttribute . Thuộc tính đại diện hoặc lưu trữ siêu dữ liệu về các loại và phương pháp. Bạn có thể đính kèm thuộc tính vào lớp, trường lớp, phương thức lớp, giao diện hoặc bảng.
Áp dụng thuộc tính cho người xử lý của các đại diện và phương pháp để ánh xạ trình xử lý đến các mục tiêu đó.
Tạo lớp thuộc tính
Một lớp thuộc tính có thể mở rộng lớp SysAttribute trực tiếp hoặc có thể mở rộng bất kỳ hậu duệ nào của lớp SysAttribute . Bạn không thể sử dụng lớp SysAttribute làm thuộc tính vì nó được khai báo là trừu tượng. Ví dụ sau đây cho thấy khai báo và thiết kế của một lớp thuộc tính bình thường mà bạn có thể tạo ra.
public class PracticeAttribute extends SysAttribute
{
// Fields in the classDeclaration.
StartEnd startEndEnum;
str reason;
// Constructor.
public void new(StartEnd _startEndEnum, str _reason)
{
startEndEnum = _startEndEnum;
reason = _reason;
}
// Other methods can go here.
}
Trang trí lớp học bằng một thuộc tính
Ví dụ sau đây cho thấy một lớp học và một phương pháp được trang trí bằng PracticeAttribute được đưa ra trong ví dụ trước. Nếu hàm tạo của thuộc tính không có tham số, dấu ngoặc đơn cho các tham số là tùy chọn. Trang trí thuộc tính có thể không [AnotherAttribute] có dấu ngoặc đơn.
[PracticeAttribute(StartEnd::End, "Use the RegularClass class at the end.")]
public class RegularClass
{
[PracticeAttribute(Startend::Start, "Use the rehearse method at the start.")]
public int rehearse()
{
// Logic goes here.
}
// More fields and methods belong here.
}
Bạn có thể bỏ qua hậu tố của tên thuộc tính nếu hậu tố là Attribute. Ví dụ: bạn có thể sử dụng [Practice] thay [PracticeAttribute] vào đó trong ví dụ trước.
Người tạo thuộc tính
Bạn có thể bật lớp thuộc tính của mình để lưu trữ siêu dữ liệu tùy chỉnh mỗi khi trang trí lớp bằng cách yêu cầu hàm tạo lấy tham số. Các tham số cho hàm tạo phải là ký tự của các kiểu nguyên thủy, chẳng hạn như int,enumhoặcstr. Trình biên dịch không xây dựng một thể hiện của lớp thuộc tính. Nó lưu trữ tên của lớp thuộc tính, cộng với các giá trị chữ cho hàm tạo của nó. Vì vậy, nếu logic trong một nhà xây dựng thuộc tính sẽ đưa ra một ngoại lệ, trang trí một lớp với các thuộc tính không gây ra ngoại lệ. Ngoại lệ được tìm thấy sau đó khi một quá trình xem xét một lớp học để xem các thuộc tính mà nó được trang trí với. Quá trình đó là khi các thuộc tính được xây dựng.
Quy ước đặt tên
Tất cả các lớp thuộc tính đều có Thuộc tính hậu tố trong tên của chúng. Hậu tố Thuộc tính là quy ước tên mà Microsoft đề xuất nhưng đó không phải là yêu cầu hệ thống. Bạn có thể xác định xem liệu lớp có mở rộng trực tiếp từ SysAttribute hay không bằng cách chọn lớp trong Application Explorer và xem lại thuộc tính Extends trong cửa sổ Thuộc tính.
SysObsoleteAttribute
Hệ thống cung cấp một số thuộc tính, bao gồm lớp SysObsoleteAttribute . Một trong những sử dụng các lớp SysObsoleteAttribute là để thông báo cho biên dịch rằng biên dịch nên không thành công nếu một phương pháp cụ thể được gọi trong mã nguồn. Trình biên dịch từ chối biên dịch và hiển thị thông báo cụ thể được lưu trữ trong việc sử dụng thuộc tính này. Lớp SysObsoleteAttribute cũng có thể được sử dụng để thông báo cho trình biên dịch để phát hành thông báo cảnh báo thay vì lỗi.
Ví dụ về mã SysObsoleteAttribute
[SysObsoleteAttribute("The Automobile class might have faster performance.", false)]
class Bicycle
{
// Members of the Bicycle class go here.
}
Phản ánh siêu dữ liệu
Bạn sử dụng phản chiếu để tìm siêu dữ liệu thuộc tính được đính kèm với lớp. Các lớp dùng để phản ánh thuộc tính như sau:
- Lớp DictClass – Dành cho lớp học và giao diện.
- Lớp DictMethod – Đối với các phương pháp về lớp học, giao diện hoặc bảng.
Ở các lớp phản chiếu trước, các phương pháp phản ánh trên siêu dữ liệu thuộc tính như sau:
- phương pháp getAllAttributes
- phương pháp getAttribute
- phương pháp getAttributedClasses
- phương pháp getAttributes
Lưu ý
Không có cơ chế để liệt kê tất cả các phương pháp hoặc lớp được trang trí bằng một thuộc tính cụ thể từ mã X++. Tuy nhiên, vì trình biên dịch X++ ghi lại thông tin này trong cơ sở dữ liệu tham chiếu chéo, bạn có thể khai thác thông tin này từ đó.
Ví dụ về mã phản chiếu siêu dữ liệu
Sử dụng lớp DictMethod để tìm giá trị siêu dữ liệu của thuộc tính trang trí phương pháp. Ví dụ về mã sau đây sử dụng lớp SysEntryPointAttribute làm thuộc tính. Hàm chấp nhận giá trị tham số của bạn cho tên phương thức và cho tên của lớp có chứa phương thức. Phương pháp parmChecked đặc biệt cho lớp SysEntryPointAttribute và phương pháp này không được thừa kế từ lớp cơ sở SysAttribute. Mỗi lớp thuộc tính có thể có tên phương thức riêng cho siêu dữ liệu của nó.
static public int MetadataOfSysEntryPointAttributeOnMethod
(
str _sNameOfClass,
str _sNameOfMethod
)
{
// Return Values:
// 0 == Has the attribute, its metadata value is false;
// 1 == Has the attribute, its metadata value is true;
// 2 == The method lacks the SysEntryPointAttribute.
int nReturnValue = -1,
nClassId;
boolean boolParmChecked;
DictMethod dm;
Object attributeAsObject;
SysEntryPointAttribute sepAttribute;
Global::info("Starting AttributeReflection"
+ " ::MetadataOfSysEntryPointAttributeOnMethod ....");
Global::info(strFmt
("Parameters are: _sNameOfClass = %1 , _sNameOfMethod = %2 .",
_sNameOfClass, _sNameOfMethod)
);
nClassId = Global::className2Id(_sNameOfClass);
dm = new DictMethod
(UtilElementType::ClassInstanceMethod,
nClassId,
_sNameOfMethod
);
attributeAsObject = dm.getAttribute("SysEntryPointAttribute");
if (attributeAsObject is SysEntryPointAttribute)
{
sepAttribute = attributeAsObject as SysEntryPointAttribute;
boolParmChecked = sepAttribute.parmChecked();
if (boolParmChecked)
nReturnValue = 1;
else
nReturnValue = 0;
Global::info(
strFmt("Return value is %1.",
nReturnValue)
);
}
else
{
nReturnValue = 2;
Global::error("Object is not a SysEntryPointAttribute??");
}
return nReturnValue;
}
/*** Output displayed in the Infolog.
Message (05:03:22 pm)
Starting AttributeReflection ::MetadataOfSysEntryPointAttributeOnMethod ....
Parameters are: _sNameOfClass = CustCustomerService , _sNameOfMethod = create .
Return value is 1.
***/
/**************
// Simple AOT > Jobs job to run the method.
static void AttributeReflection33Job(Args _args)
{
AttributeReflection::MetadataOfSysEntryPointAttributeOnMethod
("CustCustomerService", "create");
}
**************/