Märkus.
Juurdepääs sellele lehele nõuab autoriseerimist. Võite proovida sisse logida või kausta vahetada.
Juurdepääs sellele lehele nõuab autoriseerimist. Võite proovida kausta vahetada.
Märkus.
Kogukonna huvirühmad on nüüd liikunud Yammerist Microsoft Viva Engage'i. Viva Engage kogukonnaga liitumiseks ja viimastes aruteludes osalemiseks täida vorm Request access to Finance and Operations Viva Engage Community ning vali kogukond, kuhu soovid liituda.
Selles artiklis kirjeldatakse atribuutide kasutamist klahvikombinatsioonis X++.
Atribuut on mittetühja klass, mis laiendab (pärib) klassi SysAttribute . Atribuudid tähistavad või salvestavad tüüpide ja meetodite metaandmeid. Atribuudi saate manustada klassile, klassiväljale, klassimeetodile, liidesele või tabelile.
Rakendage atribuudid volitatud esindajate ja meetodite ohjuritele, et vastetada ohjurid nende sihtmärkidega.
Atribuudiklassi loomine
Atribuudiklass võib klassi SysAttribute otse laiendada või laiendada klassi SysAttribute järeltulijat. Klassi SysAttribute ei saa atribuudina kasutada, kuna see on kuulutatud abstraktseks. Järgmises näites on näidatud loodava tavalise atribuudiklassi deklaratsioon ja kujundus.
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.
}
Klassi kaunistamine atribuudiga
Järgmises näites on esitatud klass ja meetod, mis on kaunistatud eelmises näites esitatud PracticeAttribute'iga . Kui atribuudi konstruktor ei kasuta parameetreid, pole parameetrite sulud valikulised. Atribuudi kaunistus võib olla [AnotherAttribute] ilma sulgudeta.
[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.
}
Kui järelliide on Attribute, võite atribuudi nime järelliite ära jätta. Näiteks saate kasutada [Practice] eelmises näites selle asemel [PracticeAttribute] .
Atribuudikonstruktorid
Saate lubada atribuudiklassil talletada kohandatud metaandmeid iga kord, kui see klassi kaunistab, võttes selleks konstruktori parameetrid. Konstruktori parameetrid peavad olema primitiivsete tüüpide (nt int,enum või str) literaalid. Kompilaator ei koosta atribuudiklassi eksemplari. Selles talletatakse atribuudiklassi nimi ja konstruktori literaalväärtused. Seega, kui atribuudikonstruktori loogika põhjustaks erandi, ei põhjusta klassi kaunistamine atribuudiga erandit. Erand leitakse hiljem, kui protsess vaatab klassi, et näha selle atribuuti, millega see on kaunistatud. See protsess toimub siis, kui atribuut koostatakse.
Nimetamise reeglid
Kõigil atribuudiklassidel on nimes järelliite Atribuut . Atribuudi järelliide on Microsofti soovitatav nimi, kuid see pole süsteeminõue. Saate määrata, kas klass laieneb otse SysAttribute'ist, valides Application Exploreris klassi ja vaadates läbi akna Atribuudid atribuudid atribuudiLaiendad.
SysObsoleteAttribute
Süsteem pakub mitmeid atribuute, sealhulgas klassi SysObsoleteAttribute . Klassi SysObsoleteAttribute üks kasutus on kompilaatori teavitamine kompilaatorist, et kompileerimine peaks nurjuma, kui lähtekoodis kutsutakse konkreetne meetod. Kompilaator hülgab kompilaatori ja kuvab konkreetse teate, mis on talletatud atribuudi selles kasutusviisis. Klassi SysObsoleteAttribute saab kasutada ka selleks, et teavitada kompilaatorit tõrgete asemel hoiatusteadete väljastamisest.
SysObsoleteAttribute-koodi näide
[SysObsoleteAttribute("The Automobile class might have faster performance.", false)]
class Bicycle
{
// Members of the Bicycle class go here.
}
Metaandmete peegeldus
Mõtiskluste abil saate leida klassile manustatud atribuudi metaandmed. Atribuudi peegelduse jaoks kasutatavad klassid on järgmised.
- DictClass klass – klasside ja liideste jaoks.
- DictMethod class – klasside, liideste või tabelite meetodite jaoks.
Eelmiste peegeldusklasside puhul on atribuudi metaandmete kajastamise meetodid järgmised.
- meetod getAllAttributes
- meetod getAttribute
- meetod getAttributedClasses
- meetod getAttributes
Märkus.
Puudub mehhanism kõigi X++ koodist pärineva atribuudiga seotud meetodite või klasside loetlemiseks. Kuna aga X++ kompilaator salvestab selle teabe ristviiteandmebaasi, saate seda teavet sealt kaevandada.
Metaandmete peegelduskoodi näide
Klassi DictMethod abil saate otsida meetodit kaunistava atribuudi metaandmete väärtust. Järgmises näites kasutatakse atribuudina klassi SysEntryPointAttribute . See aktsepteerib teie meetodi nime ja meetodit sisaldava klassi nime parameetriväärtused. Meetod parmChecked on seotud klassiga SysEntryPointAttribute ja see ei pärita selle põhiklassist SysAttribute. Igal atribuudiklassil võib metaandmete jaoks olla oma meetodi nimi.
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");
}
**************/