Napomena
Za pristup ovoj stranici potrebna je autorizacija. Možete se pokušati prijaviti ili promijeniti direktorije.
Za pristup ovoj stranici potrebna je autorizacija. Možete pokušati promijeniti direktorije.
Napomena
Grupe interesa zajednice sada su se prebacili sa servisa Yammer na Microsoft Viva Engage. Da biste se pridružili zajednici programa Viva Engage i uključili u najnovije rasprave, ispunite obrazac Request pristupu financije i operacije Viva Engage zajednici i odaberite zajednicu kojoj se želite pridružiti.
U ovom se članku opisuje korištenje atributa u sustavu X++.
Atribut je klasa koja nijeabstract koja proširuje (nasljeđuje od) klase SysAttribute . Atributi predstavljaju ili pohranjuju metapodatke o vrstama i metodama. Atribut možete priložiti razredu, polju klase, metodi klase, sučelju ili tablici.
Primijenite atribute na rukovatelje ovlaštenika i načine mapiranja rukovatelja na te ciljeve.
Stvaranje klase atributa
Klasa atributa može izravno proširiti klase SysAttribute ili može proširiti bilo koji podređeni element klase SysAttribute . Klase SysAttribute ne možete koristiti kao atribut jer je deklarirana kao apstraktna. U sljedećem je primjeru prikazano deklariranje i dizajn uobičajene klase atributa koju možete stvoriti.
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.
}
Ukrašavanje klase s atributom
Sljedeći primjer prikazuje razred i metodu ukrašenu atributom PracticeAttribute navedenom u prethodnom primjeru. Ako graditelj atributa ne uzima parametre, zagrade za parametre nisu obavezne. Atribut ukras mogao biti [AnotherAttribute] bez zagrada.
[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.
}
Možete izostaviti nastavak naziva atributa ako je sufiks Attribute. Možete, primjerice, koristiti [Practice] u [PracticeAttribute] prethodnom primjeru.
Graditelji atributa
Svojoj klasi atributa možete omogućiti pohranu prilagođenih metapodataka svaki put kada ukrasi razred tako da njegov graditelj ima parametre. Parametri za graditelja moraju biti doslovne jednostavne vrste, kao što su int,enumilistr. Kompiler ne konstruira instancu klase atributa. Pohranjuje naziv klase atributa i doslovne vrijednosti za graditelja. Stoga, ako bi logika u graditelju atributa bacila iznimku, ukrašavanje klase s atributom ne uzrokuje iznimku. Iznimka se pojavljuje kasnije kada proces traži razred da bi mu se prikazao atribut s kojem je uređen. Taj se postupak događa kada se atribut konstruira.
Konvencije o imenovanju
Sve klase atributa imaju atribut sufiksa u nazivu. Sufiks atributa konvencija je naziva koju Microsoft preporučuje, ali nije sistemski preduvjet. Možete odrediti proširuje li se klasa izravno iz alata SysAttribute tako da odaberete razred u eksploreru za aplikacije i pregledate svojstvo Extends u prozoru Svojstva.
SysObsoleteAttribute
Sustav nudi nekoliko atributa, uključujući i klase SysObsoleteAttribute . Jedna upotreba klase SysObsoleteAttribute jest obavijestiti kompiler da kompiliranje ne bi trebalo uspjeti ako se u izvornom kodu poziva određeni postupak. Kompiler odbija kompiliranje i prikazuje konkretnu poruku pohranjenu u ovoj upotrebi atributa. Klasa SysObsoleteAttribute može se koristiti i za obavještavanje kompilera da bi se poruke upozorenja pojavile umjesto pogrešaka.
SysObsoleteAttribute primjer koda
[SysObsoleteAttribute("The Automobile class might have faster performance.", false)]
class Bicycle
{
// Members of the Bicycle class go here.
}
Odraz metapodataka
Pomoću odraza možete pronaći metapodatke atributa koji su pridruženi klasi. Klase koje se koriste za odraz atributa su sljedeće:
- Klasa DictClass – za klase i sučelja.
- Klasa DictMethod – za metode klasa, sučelja ili tablica.
U prethodnim razredima odraza metode za odražavanje na metapodatke atributa su sljedeće:
- getAllAttributes metoda
- getAttribute metoda
- getAttributedClasses metoda
- getAttributes metoda
Napomena
Nema mehanizma za popisivanje svih metoda ili klasa koje su ukrašene određenim atributom iz X ++ koda. Međutim, budući da kompajler X++ bilježi te informacije u unakrsnoj bazi podataka, s tog mjesta možete moje te podatke.
Primjer koda odraza metapodataka
Pomoću klase DictMethod pronađite vrijednost metapodataka atributa koji ukrasi metodu. U sljedećem primjeru koda kao atribut koristi se klasa SysEntryPointAttribute . Prihvaća vrijednosti parametara za naziv metode i za naziv klase koja sadrži metodu. Metoda parmChecked je posebno za klase SysEntryPointAttribute , a ne nasljeđuje se iz svoje osnovne klase SysAttribute. Svaka klasa atributa može imati vlastiti naziv metode za svoje metapodatke.
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");
}
**************/