Pastaba.
Prieigai prie šio puslapio reikalingas įgaliojimas. Galite bandyti prisijungti arba pakeisti katalogus.
Prieigai prie šio puslapio reikalingas įgaliojimas. Galite bandyti pakeisti katalogus.
Šiame straipsnyje aprašomas atributų naudojimas X++.
Atributas yra neabstraktinė klasė, kuri išplečia (paveldi iš) SysAttribute klasę. Atributai nurodo arba saugo metaduomenis apie tipus ir metodus. Atributą galite pridėti prie klasės, klasės lauko, klasės metodo, sąsajos ar lentelės.
Pritaikykite atributus atstovų apdorojimo programai ir būdus, kaip susieti apdorojimo programas su šiomis paskirtimis.
Atributo klasės kūrimas
Atributo klasė gali išplėsti SysAttribute klasę tiesiogiai arba gali išplėsti bet kurį SysAttribute klasės poelemenčių. Negalite naudoti SysAttribute klasės kaip atributo, nes jis paskelbtas abstrakčiais. Toliau pateiktame pavyzdyje parodytas įprastos atributų klasės, kurią galite sukurti, deklaracija ir dizainas.
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.
}
Klasės su atributu apdailinimas
Toliau pateiktame pavyzdyje pavaizduota klasė ir metodas, papuoštas ankstesniame pavyzdyje pateiktu PracticeAttribute . Jei atributo konstruktoriaus parametrų nėra, parametrų skliausteliai yra pasirinktiniai. Atributų dekoracija gali būti [AnotherAttribute] be skliaustelių.
[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.
}
Galite praleisti atributo pavadinimo povardį, jei plėtinys yra Attribute. Pavyzdžiui, galite naudoti [Practice][PracticeAttribute] ankstesniame pavyzdyje.
Attribute constructors
Galite leisti atributų klasei saugoti pritaikytus metaduomenis kiekvieną kartą, kai ji papuoš klasę, nes konstruktoriaus parametrai bus pritaikyti. Konstruktoriaus parametrai turi būti primityvių tipų literalai, pvz., int,enum arba str. Kompiliatorius nesukonstruoja atributų klasės egzemplioriaus. Joje saugomas atributų klasės pavadinimas ir konstruktoriaus literalinės reikšmės. Todėl, jei atributo konstruktoriaus logika įvyko išimtis, klasės su atributu apdailinimas nesukels išimties. Išimtis randama vėliau, kai procesas peržiūri klasę, kad pamatytų atributą, kuriuo jis papuoštas. Šis procesas yra, kai atributas yra konstruojamas.
Naming conventions
Visų atributų klasių pavadinime yra atributas sufiksas . Atributo povardis yra pavadinimų konvencija, kurią rekomenduoja "„Microsoft“", tačiau tai nėra sistemos reikalavimas. Galite nustatyti, ar klasė tęsiasi tiesiogiai iš SysAttribute pasirinkdami klasę programų naršyklėje ir peržiūrėję ypatybę Extends lange Ypatybės .
SysObsoleteAttribute
Sistema pateikia kelis atributus, įskaitant SysObsoleteAttribute klasę. Vienas Iš SysObsoleteAttribute klasės naudojimas yra pranešti kompiliatorius, kompiliatorius, kad kompiliavimo turėtų nepavykti, jei tam tikro metodo iškviečiamas šaltinio kodas. Kompiliatorius atmeta kompiliavimo ir rodo konkretų pranešimą, kuris saugomas naudojant šį atributą. SysObsoleteAttribute klasę taip pat galima naudoti informuojant kompiliatorių, kad jis galėtų pateikti įspėjimo pranešimus, o ne klaidas.
SysObsoleteAttribute kodo pavyzdys
[SysObsoleteAttribute("The Automobile class might have faster performance.", false)]
class Bicycle
{
// Members of the Bicycle class go here.
}
Metadata reflection
Atspindys naudojamas norint rasti atributo metaduomenis, pridėtus prie klasės. Atributų atspindžiams naudojamos šios klasės:
- "DictClass" klasė – klasėms ir sąsajoms.
- DictMethod klasė – klasių, sąsajų ar lentelių metodams.
Ankstesnių atspindžių klasių atributų metaduomenyse apmąstymo metodai yra tokie:
- getAllAttributes method
- getAttribute method
- getAttributedClasses method
- getAttributes method
Note
Nėra mechanizmo, skirto visiems metodams ar klasėms, kurie yra puošia tam tikru atributu iš X++ kodo, išvardyti. Tačiau dėl to, kad X++ kompiliatorius įrašo šią informaciją į kryžminę nuorodą duomenų bazėje, galite iš ten mano šią informaciją.
Metaduomenų atspindžio kodo pavyzdys
Naudokite DictMethod klasę, kad rastumėte atributo, kuris papuoš metodą, metaduomenų reikšmę. Toliau pateiktame kodo pavyzdyje kaip atributas naudojama SysEntryPointAttribute klasė. Ji priima metodo pavadinimo ir klasės, kurioje yra metodas, parametro reikšmes. ParmChecked metodas yra ypač skirtas SysEntryPointAttribute klasei, ir jis nėra paveldimas iš pagrindinės klasės SysAttribute. Kiekviena atributų klasė gali turėti savo metaduomenų metodo pavadinimą.
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");
}
**************/